SO。我試圖製作一個C應用程序,從服務器檢索.html文件,例如www.example.com。爲此,我使用套接字和connect
send
和recv
方法。我的實現看起來是這樣的:使用C中的套接字的HTTP請求
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(void) {
//Stream sockets and rcv()
struct addrinfo hints, *res;
int sockfd;
char buf[2056];
int byte_count;
//get host info, make socket and connect it
memset(&hints, 0,sizeof hints);
hints.ai_family=AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo("www.example.com","80", &hints, &res);
sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol);
printf("Connecting...\n");
connect(sockfd,res->ai_addr,res->ai_addrlen);
printf("Connected!\n");
char *header = "GET /index.html HTTP/1.1\nHost: www.example.com\n";
send(sockfd,header,sizeof header,0);
printf("GET Sent...\n");
//all right ! now that we're connected, we can receive some data!
byte_count = recv(sockfd,buf,sizeof buf,0);
printf("recv()'d %d bytes of data in buf\n",byte_count);
printf("%s",buf);
return 0;
}
但事實是,它被卡在recv
幾秒鐘,然後緩衝buf
充滿了這一點:
HTTP/1.0 408 Request Timeout
Content-Type: text/html
Content-Length: 431
Connection: close
Date: Tue, 26 May 2015 23:08:46 GMT
Server: ECSF (fll/0781)
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>408 - Request Timeout</title>
</head>
<body>
<h1>408 - Request Timeout</h1>
<div>Server timeout waiting for the HTTP request from the client.</div>
</body>
</html>
顯然,服務器永遠不會得到我的GET字符串或它可能是錯誤的,那麼解決這個問題的正確方法是什麼?
我已經下載了libcurl,甚至在一個文件中獲得了http響應(這很好,所以我可以稍後處理它),但我非常希望手工完成。
我在這裏錯過了什麼?
我真的很困惑與sizeof和strlen的使用,我真的不知道我應該什麼時候使用它;上次發生在我身上的是套接字配置。這解決了我的問題,是的,我最近會處理錯誤。謝謝。 –
'sizeof()'返回傳遞給它的任何字節大小。你傳給它一個指針,所以你可以返回指針本身的**大小**(32位爲4個字節,64位爲8個字節),* NOT *指向的數據大小!另一方面,當你將一個靜態數組傳遞給'sizeof()'時,你會得到整個數組的大小。 –