2013-04-27 32 views
5

Linux üzerinde soket kullanarak nasıl bir http isteği yapabilirim? Şu anda, benLinux soketlerini kullanarak bir https isteği yapın

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

burada kod ilgili bölümü alıyorum (buradaki görevi göndermek için çok büyük):

çağrısında
/* 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"; ve port=80;

Denedim Mümkün olduğu kadar onw benim rutinleri kaldırmak ve sizin için daha temiz yapmak için bu kodu yazın.

+0

HTTP veya HTTPS isteği yapmaya mı çalışıyorsunuz? Sendbuf'da hangi verileri gönderiyorsunuz? – Julien

+0

@Julien: https isteği. – Jack

cevap

10

https istekleri yalnızca http istekleri gibi görünür, ancak istemciyle sunucu arasındaki gerçek iletişimin ve farklı bir varsayılan bağlantı noktasının şeffaf şifrelenmesiyle. İyi haber, şeffaf şifrelemenin, normal bir HTTP istemcisi yazdığınız gibi programlamanıza izin vermesidir. Kötü haber şu ki şifreleme, sizin için uygulamak için özel bir kütüphaneye ihtiyacınız olduğu kadar karmaşıktır. Bu bir kitaplık OpenSSL. OpenSSL kullanarak, bir istemci için minimum kod şu şekilde görünecektir:

#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

Teşekkürler! iyi çalıştı. – Jack

+0

Bu kitaplık için bazı belgeleri nereden alabilirim? – Jack

+2

@Jack Kütüphane fonksiyonlarının man sayfaları çevrimiçi olarak mevcuttur. Ayrıca, kütüphane çok yaygın olarak kullanılıyor, bu yüzden örnekler için google'a başvurabilir ve birkaç tane bulabilirsin. – user4815162342

3

HTTPS aynen HTTP gibidir, ancak bir şifreleme SSL katmanı içinde kapsüllenmiş halde. Bu HTTPS bağlantılarını yapmak için OpenSSL gibi bir lib kullanmanız gerekecektir.

OpenSSL, bir SSL kanalı üzerinden normal HTTP'yi (veya kullanmak istediğiniz başka bir protokolü) bağlamak, okumak ve yazmak için socket.h olanlarını değiştiren işlevler sunacak ve SSL bölümünün işlenmesini size şeffaf hale getirecektir.

+0

Teşekkürler! :) – Jack

İlgili konular