我有一个循环,通过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);
}
accept
函数的返回代码是什么? - didierc