2013-04-27 3 views
5

리눅스에서 소켓을 사용하여 http 요청을하는 방법은 무엇입니까? 현재, 내가리눅스에서 소켓을 사용하여 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;

I가 시도 가능한 한 내 onw 루틴을 제거하고이 코드를 입력하면 더 깨끗하게 정리할 수 있습니다.

+0

HTTP 또는 HTTPS 요청을 만드시겠습니까? 'sendbuf'에서 어떤 데이터를 보내고 있습니까? – Julien

+0

@Julien : https 요청입니다. – Jack

답변

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

+0

이 라이브러리에 대한 설명서는 어디에서 얻을 수 있습니까? – Jack

+2

@Jack 라이브러리 함수의 맨 페이지는 온라인에서 사용할 수 있습니다. 또한 라이브러리는 매우 널리 사용되므로 예제를 위해 Google을 사용할 수 있으며 상당수를 찾을 수 있습니다. – user4815162342

3

HTTPS는 HTTP와 비슷하지만 암호화 SSL 레이어에 캡슐화되어 있습니다. 이러한 HTTPS 연결을 만들려면 OpenSSL과 같은 lib를 사용해야합니다.

OpenSSL은 일반 HTTP (또는 사용하려는 다른 프로토콜)를 SSL 채널을 통해 연결, 읽기 및 쓰기하여 SSL 부분의 처리를 사용자에게 투명하게 만들어주는 기능을 제공합니다.

+0

너무 감사합니다! :) – Jack

관련 문제