14

Linux でソケットを使用して http 要求を行うにはどうすればよいですか? 現在、私は得ています

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 ルーチンとタイプを可能な限り削除して、よりクリーンにするようにしました。

4

2 に答える 2

25

httpsリクエストはリクエストと同じように見えますhttpが、クライアントとサーバー間の実際の通信は透過的に暗号化され、別のデフォルト ポートを使用します。幸いなことに、透過的な暗号化を使用すると、通常の 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()
于 2013-04-27T18:25:11.427 に答える
6

HTTPS は HTTP と同じですが、暗号化 SSL レイヤーにカプセル化されています。これらの HTTPS 接続を行うには、OpenSSL のようなライブラリを使用する必要があります。

OpenSSL は、socket.h のものを置き換える機能を提供し、SSL チャネルを介して通常の HTTP (または使用したい他のプロトコル) に接続、読み取り、書き込みを行い、SSL 部分の処理を透過的にします。

于 2013-04-27T18:21:15.017 に答える