【发布时间】:2021-05-02 22:41:57
【问题描述】:
我正在尝试创建一个小程序,该程序通过标准输入接收 http 请求并将其发送到服务器。 这是我正在使用的代码:
int portno = 3000;
char *message = buf;
char response[4096];
int byte_count;
fsize = strlen(message);
int sockfd;
/* fill in the parameters */
printf("Request:\n%s\n",message);
/* create the socket */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) error("ERROR opening socket");
int sz = (1024 * 1024);
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz)) == -1) {
perror("setsockopt");
exit(1);
}
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(portno);
saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if (connect(sockfd, &saddr, sizeof(saddr)) == -1) {
perror("connect");
}
send(sockfd, message, fsize, MSG_NOSIGNAL);
printf("written");
byte_count = recv(sockfd,response,sizeof(response)-1,0); // <-- -1 to leave room for a null terminator
response[byte_count] = 0; // <-- add the null terminator
printf("recv()'d %d bytes of data in buf\n",byte_count);
printf("%s",response);
close(sockfd);
buf 等于这个
GET /alias%2Findex.html HTTP/1.0\r\n
\r\n
\r\n
\r\n
我通过其他堆栈溢出帖子进行了一些研究,他们指出当系统等待响应时,recv 通常会挂起。我不知道是什么原因造成的。
【问题讨论】:
-
缓冲区是否包含文字
\r和\n,或者是那些 CR 和 LF 字符? -
那些是 CR 和 LF 字符。
-
当事情不工作时,总是检查你的返回值。您目前不知道
send是否成功。并检查您的recv返回值。在写信给response[-1]时,你会很幸运遇到段错误。