我读到它应该同时不受不同线程的影响,但是我的程序有一些奇怪的行为,我不知道出了什么问题。
我有并发线程与客户端套接字通信
- 一个正在发送到套接字
- 一个做选择,然后从同一个套接字接收
由于我仍在发送,客户端已经收到数据并关闭了套接字。同时,我正在对该套接字进行选择和接收,它返回 0(因为它已关闭)所以我关闭了这个套接字。但是,发送尚未返回......并且由于我在此套接字上调用 close,发送调用因 EBADF 而失败。
我知道客户端已经正确接收到数据,因为我在关闭套接字后输出它并且它是正确的。但是,就我而言,我的发送调用仍然返回错误(EBADF),所以我想修复它以使其不会失败。
这并不总是发生。它可能发生在 40% 的时间里。我不在任何地方使用睡眠。我应该在发送或接收之间有暂停吗?
这是一些代码:
发送:
while(true)
{
// keep sending until send returns 0
n = send(_sfd, bytesPtr, sentSize, 0);
if (n == 0)
{
break;
}
else if(n<0)
{
cerr << "ERROR: send returned an error "<<errno<< endl; // this case is triggered
return n;
}
sentSize -= n;
bytesPtr += n;
}
接收:
while(true)
{
memset(bufferPointer,0,sizeLeft);
n = recv(_sfd,bufferPointer,sizeLeft, 0);
if (debug) cerr << "Receiving..."<<sizeLeft<<endl;
if(n == 0)
{
cerr << "Connection closed"<<endl; // this case is triggered
return n;
}
else if (n < 0)
{
cerr << "ERROR reading from socket"<<endl;
return n;
}
bufferPointer += n;
sizeLeft -= n;
if(sizeLeft <= 0) break;
}
在客户端,我使用相同的接收代码,然后在套接字上调用 close()。然后在我这边,我从接收调用中得到 0 并且还在套接字上调用 close() 然后我的发送失败。还没完结?!但是我的客户已经得到了数据!