2013-04-27 65 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 2013-04-27 18:09:40

+0

@Julien:https請求。 – Jack 2013-04-28 03:03:16

回答

10

https請求看起來就像http請求,但對客戶端和服務器之間的實際通信以及不同的默認端口進行透明加密。好消息是,透明加密使您可以像編寫常規HTTP客戶端一樣進行編程。壞消息是加密非常複雜,你需要一個專門的庫來爲你實現它。

一個這樣的庫是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 2013-04-28 03:22:47

+0

我在哪裏可以得到這個圖書館的一些文件? – Jack 2013-04-28 04:13:57

+2

@Jack庫函數的手冊頁可在線獲取。此外,該庫的使用非常廣泛,所以你可以通過谷歌的例子,並會發現不少。 – user4815162342 2013-04-28 06:11:27

3

HTTPS就像HTTP一樣,但其封裝在加密SSL層中。您將需要使用像OpenSSL這樣的庫來建立這些HTTPS連接。

OpenSSL將提供替換socket.h的函數,通過SSL通道連接,讀取和寫入常規HTTP(或任何其他您想使用的協議),使SSL部分的處理對您透明。

+0

也謝謝! :) – Jack 2013-04-28 03:23:13