Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当客户端关闭连接时,服务器套接字完成 我试图创建一个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 - Fatal编程技术网

当客户端关闭连接时,服务器套接字完成 我试图创建一个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++的服务器套接字,以便一次接受一个客户端连接。程序成功创建服务器套接字并等待传入连接,但当客户端关闭连接时,程序将无休止地循环。否则,如果连接中断,它将继续按预期等待新的连接。知道为什么会这样吗?谢谢 这是我的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() 表

当n
当您编写了一个TCP服务器,但使用了特定于无连接协议(UDP)的
recvfrom
sendto
时,这会中断。


尝试使用
recv
send
。这可能会有所帮助。

您已经编写了一个TCP服务器,但您使用的是
recvfrom
sendto
,这两种协议特定于无连接协议(UDP)。

尝试使用
recv
send
。这可能会有所帮助。

问题在于您的“n”和recvfrom。您有一个TCP客户端,因此recvfrom不会返回正确的值

试着看看:

编辑1:

  • 请注意,您不执行绑定not connect()
  • 表示接收数据时出错,将相应设置errno,请尝试检查错误标志
问题在于您的“n”和recvfrom。您有一个TCP客户端,因此recvfrom不会返回正确的值

试着看看:

编辑1:

  • 请注意,您不执行绑定not connect()
  • 表示接收数据时出错,将相应设置errno,请尝试检查错误标志

您从未在父进程中关闭
connfd
(当childpid!=0时),并且您没有正确终止将尝试循环的子进程。您的if块应该如下所示:

if ((childpid = fork()) == 0) {
    ...
    close(connfd);
    exit(0);
}
else {
    close(connfd);
}
但是,正如您所说的,您希望一次接受一个连接,,您不能简单地进行分叉

如其他答案所示:

  • 未经测试,请勿使用mesg[n]
    n
    =0
  • recvfrom
    sendto
    对于TCP来说是过度杀伤力,只需使用
    recv
    send
    (甚至
    read
    write

您从未在父进程中关闭
connfd
(当childpid!=0时),并且您没有正确终止将尝试循环的子进程。您的if块应该如下所示:

if ((childpid = fork()) == 0) {
    ...
    close(connfd);
    exit(0);
}
else {
    close(connfd);
}
但是,正如您所说的,您希望一次接受一个连接,,您不能简单地进行分叉

如其他答案所示:

  • 未经测试,请勿使用mesg[n]
    n
    =0
  • recvfrom
    sendto
    对于TCP来说是过度杀伤力,只需使用
    recv
    send
    (甚至
    read
    write

即使我删除该行,程序仍会循环打印“-1:”,似乎永远不会到达break子句。您确定重复的-1不是来自“new fork”吗?我建议您在输入fork后打印f。顺便说一句,在socket server中使用fork很古老,对现代情况来说也很糟糕,请改用epoll。谢谢@Calvin,因为Serge建议我的场景不需要fork(但我下次会接受您的建议),即使我删除该行,程序仍会循环打印“-1:”,似乎永远也达不到break子句..你确定重复的-1不是来自“new fork”吗?我建议你在输入fork后打印F。顺便说一句,在socket server中使用fork对于现代情况来说既古老又可怕,请尝试epoll。谢谢@Calvin,因为Serge建议我的场景不需要fork(但我下次会采纳你的建议)recvfrom根据手册页对tcp套接字有效(尽管我也使用recv())recvfrom根据手册页对tcp套接字有效(尽管我也使用recv())感谢@Serge,移除不必要的分叉,在将其用作
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);
}