在Linux上使用套接字发出https请求

如何使用Linux上的套接字发出http请求? 目前,我越来越

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

这里是代码的相关部分(这里function太大了):

  /* 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例程,并从此代码键入,以使您更清洁。

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() 

HTTPS就像HTTP一样,但是封装在一个加密的SSL层中。 您需要使用像OpenSSL这样的库来建立这些HTTPS连接。

OpenSSL将提供替换socket.h的函数,通过SSL通道连接,读取和写入常规的HTTP(或其他任何你想使用的协议),使得SSL部分的处理对你来说是透明的。