2013-04-27 66 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