我对网络编程完全陌生。所以我正在开发一个程序,将类似的东西传递给socket:
GET /index.html HTTP/1.1\r\n // index.html is the site being read from
Host: www.google.com\r\n // host can be anything
\r\n
请注意,/ index.html和google.com只是示例。我的程序通过命令行输入替换它们。
所以我将GET消息存储在字符串中,然后使用send()方法将请求发送到服务器。我检查了errno并返回"Success"
对,不是我卡住了,不知道接下来要做什么来阅读HTML。我认为RIO库可以帮助我解决这个问题,但我不知道如何实现后续步骤。
这是我到目前为止所做的:
int open_clientfd(char *hostname, int port)
{
int clientfd;
struct hostent *hp;
struct sockaddr_in serveraddr;
if ((clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -1; /* Check errno for cause of error */
/* Fill in the server's IP address and port */
if ((hp = gethostbyname(hostname)) == NULL)
return -2; /* Check h_errno for cause of error */
bzero((char *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
bcopy((char *)hp->h_addr_list[0],
(char
*)&serveraddr.sin_addr.s_addr,
hp->h_length);
serveraddr.sin_port = htons(port);
/* Establish a connection with
* the server */
if (connect(clientfd, (SA *)
&serveraddr,
sizeof(serveraddr)) < 0)
return -1;
return clientfd;
}
void sendRequest(int clientfd, char request[128]) {
send(clientfd, request, sizeof(request), 0);
fprintf(stderr, "%s\n", strerror(errno)); // return SUCCESS
}
int main(int argc, char **argv) {
int clientfd, port;
char *host, *fileURL, buf[MAXLINE];
rio_t rio;
host = argv[1];
fileURL = argv[2];
port = atoi(argv[3]);
clientfd = Open_clientfd(host, port);
// set up request string
char request[128];
// ....
// now request stores the string above
sendRequest(clientfd, request);
}
答案 0 :(得分:2)
在下一步中,您可以调用recv或读取
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t read(int fd, void *buf, size_t count);
但是你必须考虑TCP是面向流的protcol。因此,响应可能会返回一个或多个TCP消息。你不能认为它会成为一个,你不知道响应的大小。 read / recv的返回可能不会带来整个HTTP消息。然后你必须阅读,直到你到达HTTP标题的末尾&#34; \ r \ n \ r \ n&#34;。之后,您必须解析到目前为止获得的响应并找到标题Content-Length,获取内容长度,它将为您提供HTTP数据的大小。然后从数据的开头,您阅读Content-Length Bytes。