如何解决即使我遵循了所有约定,接收仍然挂起?
我正在尝试创建一个小程序,该程序通过 stdin 接收 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 通常在系统等待响应时挂起。我不知道是什么原因造成的。
解决方法
这是您的程序,只是稍作修改。它对我有用。 您确定在本地主机端口 3000 上运行的任何服务器都正确响应吗?顺便说一句,我不得不将我的系统的端口更改为 8080。
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
char buf[1 << 16] = "GET /file.txt HTTP/1.0\r\n"
"\r\n"
"\r\n";
int main() {
int portno = 8080;
char *message = buf;
int byte_count;
int 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)
perror("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,(struct sockaddr *)&saddr,sizeof(saddr)) == -1) {
perror("connect");
}
send(sockfd,message,fsize,MSG_NOSIGNAL);
printf("written");
while ((byte_count = recv(sockfd,buf,sizeof(buf) - 1,0)) >
0) { // <-- -1 to leave room for a null terminator
buf[byte_count] = 0; // <-- add the null terminator
printf("recv()'d %d bytes of data in buf\n",byte_count);
printf("%s",buf);
}
close(sockfd);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。