当客户端关闭连接时,服务器套接字完成 我试图创建一个C++的服务器套接字,以便一次接受一个客户端连接。程序成功创建服务器套接字并等待传入连接,但当客户端关闭连接时,程序将无休止地循环。否则,如果连接中断,它将继续按预期等待新的连接。知道为什么会这样吗?谢谢 这是我的C++服务器代码: int-listenfd,connfd,n; servaddr、cliaddr中的结构sockaddr\u; socklen_t clilen; pid_t childpid; char-mesg[1000]; listenfd=套接字(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY); servaddr.sin_port=htons(32000); 绑定(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)); 听(listenfd,1024); while(true){ clilen=sizeof(cliaddr); connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&clilen); if((childpid=fork())==0){ 关闭(listenfd); while(true){ n=recvfrom(connfd,mesg,1000,0,(struct sockaddr*)和cliaddr,&clilen); sendto(connfd,mesg,n,0,(struct sockaddr*)和cliaddr,sizeof(cliaddr)); mesg[n]=0; printf(“%d:%s\n”,n,mesg); 如果(n)
当n当客户端关闭连接时,服务器套接字完成 我试图创建一个C++的服务器套接字,以便一次接受一个客户端连接。程序成功创建服务器套接字并等待传入连接,但当客户端关闭连接时,程序将无休止地循环。否则,如果连接中断,它将继续按预期等待新的连接。知道为什么会这样吗?谢谢 这是我的C++服务器代码: int-listenfd,connfd,n; servaddr、cliaddr中的结构sockaddr\u; socklen_t clilen; pid_t childpid; char-mesg[1000]; listenfd=套接字(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY); servaddr.sin_port=htons(32000); 绑定(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)); 听(listenfd,1024); while(true){ clilen=sizeof(cliaddr); connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&clilen); if((childpid=fork())==0){ 关闭(listenfd); while(true){ n=recvfrom(connfd,mesg,1000,0,(struct sockaddr*)和cliaddr,&clilen); sendto(connfd,mesg,n,0,(struct sockaddr*)和cliaddr,sizeof(cliaddr)); mesg[n]=0; printf(“%d:%s\n”,n,mesg); 如果(n),c++,sockets,C++,Sockets,当n 当您编写了一个TCP服务器,但使用了特定于无连接协议(UDP)的recvfrom和sendto时,这会中断。 尝试使用recv和send。这可能会有所帮助。您已经编写了一个TCP服务器,但您使用的是recvfrom和sendto,这两种协议特定于无连接协议(UDP)。 尝试使用recv和send。这可能会有所帮助。问题在于您的“n”和recvfrom。您有一个TCP客户端,因此recvfrom不会返回正确的值 试着看看: 编辑1: 请注意,您不执行绑定not connect() 表
当您编写了一个TCP服务器,但使用了特定于无连接协议(UDP)的
recvfrom
和sendto
时,这会中断。
尝试使用
recv
和send
。这可能会有所帮助。您已经编写了一个TCP服务器,但您使用的是recvfrom
和sendto
,这两种协议特定于无连接协议(UDP)。
尝试使用
recv
和send
。这可能会有所帮助。问题在于您的“n”和recvfrom。您有一个TCP客户端,因此recvfrom不会返回正确的值
试着看看:
编辑1:
- 请注意,您不执行绑定not connect()
- 表示接收数据时出错,将相应设置errno,请尝试检查错误标志
- 请注意,您不执行绑定not connect()
- 表示接收数据时出错,将相应设置errno,请尝试检查错误标志
connfd
(当childpid!=0时),并且您没有正确终止将尝试循环的子进程。您的if块应该如下所示:
if ((childpid = fork()) == 0) {
...
close(connfd);
exit(0);
}
else {
close(connfd);
}
但是,正如您所说的,您希望一次接受一个连接,,您不能简单地进行分叉
如其他答案所示:
- 未经测试,请勿使用mesg[n]
=0n
和recvfrom
对于TCP来说是过度杀伤力,只需使用sendto
和recv
(甚至send
和read
)write
connfd
(当childpid!=0时),并且您没有正确终止将尝试循环的子进程。您的if块应该如下所示:
if ((childpid = fork()) == 0) {
...
close(connfd);
exit(0);
}
else {
close(connfd);
}
但是,正如您所说的,您希望一次接受一个连接,,您不能简单地进行分叉
如其他答案所示:
- 未经测试,请勿使用mesg[n]
=0n
和recvfrom
对于TCP来说是过度杀伤力,只需使用sendto
和recv
(甚至send
和read
)write
mesg
索引之前测试n
,使用recv
和send
确实解决了问题@Serge,移除不必要的分叉,在将其用作mesg
索引之前测试n
,并使用recv
和send
是否解决了此问题如果“n”为-1,则应在错误消息中调用perror(),或使用strerror[],并且在测试之前不应将其用作数组索引。如果“n”为-1,则应在错误消息中调用perror(),或使用strerror[],并且在测试之前不应将其用作数组索引。
if ((childpid = fork()) == 0) {
...
close(connfd);
exit(0);
}
else {
close(connfd);
}