gpt4 book ai didi

C++:Linux:调用 write() 时 TCP/IP 程序崩溃

转载 作者:可可西里 更新时间:2023-11-01 02:33:40 24 4
gpt4 key购买 nike

我有一个循环,它不断地通过 TCP/IP 向客户端写入数据。连接打开如下:

newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);

为了将数据写入客户端,以下行在循环中连续执行( sleep 时间为 0.1 秒):

n = write(newsockfd,data.c_str(),data.length()+1); //+1 to include NULL in null terminated string
if(n>=0)
{
cout<<"success"<<endl;
}
else
{
cout<<"Fail"<<endl;
close(newsockfd);
newsockfd = -1;
}

如果连接因任何原因中断,我希望服务器能够读取以接收新连接。因此,如果写入失败,我会再次准备好接受第一个命令的新连接。

我的问题如下:该方法第一次成功,所以如果从客户端断开连接,write() 返回一个负数,我立即知道连接有问题,所以我关闭它并期待一个新的。服务器接收到新的连接,但是在下次使用write()时,程序立即崩溃。

为什么会这样?请帮忙,我是 TCP/IP 方面的新手。

如果需要,请询问更多信息。

向帮助者请求:

堆栈跟踪:

错误:信号 13:

    /mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x402155]
/lib/x86_64-linux-gnu/libc.so.6(+0x364a0)[0x7ffc57ac04a0]
/lib/x86_64-linux-gnu/libpthread.so.0(write+0x10)[0x7ffc5836dcb0]
/mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x4023b6]
/mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x401b54]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7ffc57aab76d]
/mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x402081]

变量定义:是一个类:

正文:

int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;

构造函数开始的东西:

LinuxTCPServer::LinuxTCPServer(int port, bool nonblocking)
{
if(nonblocking)
sockfd = socket(AF_INET, SOCK_NONBLOCK | SOCK_STREAM, 0);
else
sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = port;

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");

listen(sockfd,5);
clilen = sizeof(cli_addr);
}

最佳答案

假设 Linux >= 2.2,替换为:

n = write(newsockfd,data.c_str(),data.length()+1);

用这个:

n = send(newsockfd, data.c_str(), data.length()+1, MSG_NOSIGNAL);

send(2) 然后将返回 -1 并将 errno 设置为 EPIPE,而不是生成致命的 SIGPIPE。或者,忽略 SIGPIPE。

当您收到 SIGPIPE 时,newsockfd 后面的连接已断开。我们没有足够的代码来重现问题,客户端和服务器,所以说出什么可能是真正的错误是没有实际意义的。但是,将 SIGPIPE 转换为 EPIPE 至少会让您的服务器有机会处理断开的连接。

关于C++:Linux:调用 write() 时 TCP/IP 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15793928/

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