2013-04-27 12 views
5

linuxでソケットを使用してhttpリクエストを行うにはどうすればよいですか?現在、私はlinuxでソケットを使用してhttpsリクエストを作成する

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

が、ここでのコードの関連部分だそうだ(関数は、ここに投稿し大きすぎる):

コールで
/* 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; 

server="server.com";port=80;

私がしようとしましたできるだけ私のonwルーチンを削除し、このコードからタイプして、よりきれいにしてください。

+0

HTTPまたはHTTPSリクエストを作成しようとしていますか?あなたは 'sendbuf'でどのようなデータを送りますか? – Julien

+0

@Julien:httpsリクエスト。 – Jack

答えて

10

httpsリクエストは、リクエストと同じように見えますが、クライアントとサーバーの間の実際の通信は透過的に暗号化されています。良いことは、透過的な暗号化は、通常のHTTPクライアントを作成するのと同じようにプログラムできることです。悪い知らせは、暗号化が複雑で、それを実装するための特別なライブラリが必要だということです。

このようなライブラリの1つはOpenSSLです。 OpenSSLを使用すると、クライアントの最小コードは次のようになります。

#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

ありがとう!うまく働いた。 – Jack

+0

このライブラリのドキュメントはどこから入手できますか? – Jack

+2

@Jackライブラリ関数のマニュアルページは、オンラインで入手できます。また、ライブラリは非常に幅広く使用されているので、例としてGoogleを使用することができ、かなり見つけることができます。 – user4815162342

3

HTTPSはHTTPに似ていますが、暗号SSL層にカプセル化されています。これらのHTTPS接続を行うには、OpenSSLのようなlibを使用する必要があります。

OpenSSLは、通常のHTTP(または使用する他のプロトコル)をSSLチャネル経由で接続、読み取り、書き込み、SSL部分の処理を透過的にする関数を提供します。

+0

ありがとうございます! :) – Jack

関連する問題