2015-04-07 137 views
0

我正在編寫一個客戶端程序,它建立套接字,連接到遠程服務器併發出HTTP請求。但是,我似乎無法連接到遠程服務器。無法通過套接字連接到HTTP服務C

我相信我所做的一切都對,甚至爲sockaddr_in設置了正確的端口號,但仍然無法連接。

我錯過了什麼?

#include <netdb.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

int main(int argc, char *argv[]) 
{ 
    FILE *fout; 

    int i, c, sk; 
    char *tk, host[64], path[64], fname[64], http_msg[256], buf[1024]; 

    struct sockaddr_in remote; 
    struct hostent *hp; 
    struct servent *se; 

    if(argc != 2) 
    { 
     printf("Invalid number of arguments. Program terminating...\n"); 
     exit(1); 
    } 

    sk = socket(AF_INET, SOCK_STREAM, 0); 
    remote.sin_family = AF_INET; 

    c = 0; 
    tk = strtok(argv[1], "/"); 
    while(tk != NULL) 
    { 
     if(c == 0) 
      strcpy(host, tk); 
     else if(c == 1) 
      strcpy(path, tk); 
     else 
      strcpy(fname, tk); 
     ++c; 
     tk = strtok(NULL, "/"); 
    } 

    snprintf(http_msg, 256, "GET /%s/%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\n", path, fname, host); 

    hp = gethostbyname(host); 
    if(hp == NULL) 
    { 
     printf("Can't find host %s. Program terminating...\n", host); 
     exit(1); 
    } 

    se = getservbyname("http", "tcp"); 
    remote.sin_port = ntohs(se->s_port); 

    if(connect(sk, (struct sockaddr*)&remote, sizeof(remote)) < 0) 
    { 
     printf("Connection attempt failed. Program terminating...\n"); 
     exit(1); 
    } 

    send(sk, http_msg, sizeof(http_msg) + 1, 0); 
    recv(sk, buf, sizeof(buf), 0); 
    printf("%s\n", buf); 

    return 0; 
} 
+0

你錯過了注射馬力到遠程:'BCOPY((字符*)HP-> H_ADDR,(字符*)&remote.sin_addr.s_addr,HP- >長度h_length); ' –

+0

我剛剛嘗試過,但仍無法連接。如果我使用'memcpy'而不是重要嗎? – Delfino

+0

就在連接之前,連接完成。你如何檢查你是否連接? –

回答

1

我得到了它

問題是與線

remote.sin_port = ntohs(se->s_port); 

你並不需要將其轉換。 此代碼的工作對我來說:

if(argc != 2)                
{                   
    printf("Invalid number of arguments. Program terminating...\n");  
    exit(1);                
}                   

bzero(&remote, sizeof(remote));            
sk = socket(AF_INET, SOCK_STREAM, 0);          
remote.sin_family = AF_INET;            

c = 0;                  
tk = strtok(argv[1], "/");             
while(tk != NULL)               
{                   
    if(c == 0)                
     strcpy(host, tk);             
    else if(c == 1)               
     strcpy(path, tk);             
    else                 
     strcpy(fname, tk);             
    ++c;                 
    tk = strtok(NULL, "/");             
}                   

snprintf(http_msg, 256, "GET /%s/%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", path, fname, host); 

hp = gethostbyname(host);             
if(hp == NULL)                
{                   
    printf("Can't find host %s. Program terminating...\n", host);   
    exit(1);                
}                   

se = getservbyname("http", "tcp");           
printf("%d port\n", ntohs(se->s_port));          
remote.sin_port = se->s_port;            
bcopy((char *)hp->h_addr, (char *)&remote.sin_addr.s_addr, hp->h_length); 

if(connect(sk, (struct sockaddr*)&remote, sizeof(remote)) < 0)    
{                   
    printf("Connection attempt failed. Program terminating...\n");   
    exit(1);                
}                   

send(sk, http_msg, sizeof(http_msg) + 1, 0);        
recv(sk, buf, sizeof(buf), 0);            
printf("%s\n", buf);              

return 0;                 

}

+0

爲什麼在'remote'中使用'bzero'?我會嘗試。不幸的是我現在不在我的電腦上。 – Delfino

+0

堆棧值未初始化,因此您必須初始化它。默認情況下,我更願意重置爲0 –

0

這樣做:

remote.sin_port = ntohs(se->s_port); 
remote.sin_family = AF_INET; 
remote.sin_addr = *((struct in_addr *) hp->h_addr); 

這shoul'd做到這一點。連接後請查看\ r \ n \ r \ n:關閉。

snprintf(http_msg, 256, "GET /%s/%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", path, fname, host); 
相關問題