C:Linux:调用write()时TCP / IP程序崩溃
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C:Linux:调用write()时TCP / IP程序崩溃,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2575字,纯文字阅读大概需要4分钟。
内容图文
![C:Linux:调用write()时TCP / IP程序崩溃](/upload/InfoBanner/zyjiaocheng/954/ecaf40dc3d6b4acaae745d30e3e7d8e3.jpg)
我有一个循环,它通过TCP / IP不断向客户端写入数据.连接打开如下:
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
以下行在循环中连续执行(休眠为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程序崩溃全部内容,希望文章能够帮你解决C:Linux:调用write()时TCP / IP程序崩溃所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。