2013-04-27 25 views
5

Làm cách nào để thực hiện yêu cầu http bằng cách sử dụng ổ cắm trên linux? hiện nay, tôi nhận đượcThực hiện yêu cầu https bằng cách sử dụng ổ cắm trên linux

HTTP/1.1 301 Moved Permanently 
//etc 
Location: https://server.com 

đây là phần có liên quan của mã (chức năng là quá lớn để trả lời ở đây):

/* Socket file descriptor. */ 
     int sock; 
    struct sockaddr_in sockaddr; 
    struct hostent *host; /* Host information. */ 
    sock = socket(AF_INET, /* IPV4 protocol. */ 
       SOCK_STREAM, /* TCP socket. */ 
       0); /* O for socket() function choose the correct protocol based on the socket type. */ 

    if(sock == INVALID_SOCKET) return SOCK_GENERROR; 

    if((host = gethostbyname(server)) == NULL) { 
     close(sock); 
     return SOCK_HOSTNFOUND; 
    } 

    /* zero buffer */ 
    memset(&sockaddr, 0, sizeof(sockaddr)); 
    sockaddr.sin_family = AF_INET; 
    memcpy(&sockaddr.sin_addr, 
      host -> h_addr, 
      host -> h_length); 
    sockaddr.sin_port = htons(port); 

    if(connect(sock, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == INVALID_SOCKET) { 
     close(sock); 
     return SOCK_FERRCONN; 
    } 

    if(send(sock, sendbuf, bufsize, 0) == INVALID_SOCKET) { 
     close(sock); 
     return SOCK_FERRWRITE; 
    } 


     if((readed = recv(sock, recvbuffer, sizeof(recvbuffer), 0)) <= 0) 
    break; 

trong cuộc gọi, server="server.com";port=80;

Tôi cố gắng để loại bỏ các thói quen onw và loại của tôi từ mã này để làm sạch hơn cho bạn.

+0

Bạn đang cố thực hiện yêu cầu HTTP hoặc HTTPS? Bạn gửi dữ liệu gì trong 'sendbuf'? – Julien

+0

@Julien: Yêu cầu https. – Jack

Trả lời

10

https yêu cầu trông giống như yêu cầu http, nhưng với mã hóa trong suốt của giao tiếp thực tế giữa máy khách và máy chủ và trên cổng mặc định khác. Tin tốt là mã hóa trong suốt cho phép bạn lập trình giống như bạn đang viết một máy khách HTTP thông thường. Tin xấu là mã hóa phức tạp đến nỗi bạn cần một thư viện chuyên dụng để thực hiện nó cho bạn.

Một thư viện như vậy là OpenSSL. Sử dụng OpenSSL, mã tối thiểu cho một khách hàng sẽ trông giống như sau:

#include <openssl/ssl.h> 

// first connect to the remote as usual, but use the port 443 instead of 80 

// initialize OpenSSL - do this once and stash ssl_ctx in a global var 
SSL_load_error_strings(); 
SSL_library_init(); 
SSL_CTX *ssl_ctx = SSL_CTX_new (SSLv23_client_method()); 

// create an SSL connection and attach it to the socket 
SSL *conn = SSL_new(ssl_ctx); 
SSL_set_fd(conn, sock); 

// perform the SSL/TLS handshake with the server - when on the 
// server side, this would use SSL_accept() 
int err = SSL_connect(conn); 
if (err != 1) 
    abort(); // handle error 

// now proceed with HTTP traffic, using SSL_read instead of recv() and 
// SSL_write instead of send(), and SSL_shutdown/SSL_free before close() 
+1

Cảm ơn! làm việc tốt. – Jack

+0

Tôi có thể lấy tài liệu nào cho thư viện này ở đâu? – Jack

+2

@Jack Các trang hướng dẫn sử dụng chức năng thư viện có sẵn trực tuyến. Ngoài ra, thư viện được sử dụng rất rộng rãi, vì vậy bạn có thể google cho các ví dụ, và sẽ tìm thấy khá một vài. – user4815162342

3

HTTPS giống như HTTP, nhưng được đóng gói trong lớp SSL mã hóa. Bạn sẽ cần sử dụng một lib như OpenSSL để thực hiện các kết nối HTTPS đó.

OpenSSL sẽ cung cấp các chức năng thay thế socket.h, để kết nối, đọc và viết HTTP thông thường (hoặc bất kỳ giao thức nào khác bạn muốn sử dụng) thông qua kênh SSL, giúp xử lý phần SSL trong suốt cho bạn.

+0

Cảm ơn bạn! :) – Jack

Các vấn đề liên quan