我正在編寫一個客戶端程序,它建立套接字,連接到遠程服務器併發出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;
}
你錯過了注射馬力到遠程:'BCOPY((字符*)HP-> H_ADDR,(字符*)&remote.sin_addr.s_addr,HP- >長度h_length); ' –
我剛剛嘗試過,但仍無法連接。如果我使用'memcpy'而不是重要嗎? – Delfino
就在連接之前,連接完成。你如何檢查你是否連接? –