gpt4 book ai didi

c - C套接字编程中的持久连接

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:42 25 4
gpt4 key购买 nike

我已经编写了一个客户端代码来创建一个套接字并向客户端发送一个请求,因为 HTTP 1.1 默认使用 Connection:Alive 连接仍然关闭。我如何创建一个持久连接以便服务器监听每个请求直到连接关闭。客户端代码为:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

void error(char *msg){
perror(msg);
exit(0);
}

int main(int argc, char *argv[])
{
int sockfd, portno, n,i;
int Max_Requests;
struct sockaddr_in serv_addr;
struct hostent *server;

char buffer[256];
if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
Max_Requests=atoi(argv[3]);
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0)
error("ERROR opening socket");

server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}

bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");

i=0;
while(i<Max_Requests){
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");

bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");

printf("%s\n",buffer);
i++;
}
return 0;
}

最佳答案

问题是您使用 fgets 读取用户输入以形成请求。

问题在于您如何使用它,即读取作为请求发送到服务器的一行。然后,您立即转到 read 调用并等待响应,而无需发送完整的请求及其 header 。

这将导致服务器超时并关闭连接,因为它还没有收到完整的请求。

关于c - C套接字编程中的持久连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45231172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com