【发布时间】:2013-02-28 17:30:49
【问题描述】:
我读到它应该对不同线程同时进行是安全的,但是我的程序有一些奇怪的行为,我不知道出了什么问题。
我有并发线程与客户端套接字通信
- 发送到套接字的人
- 一个选择然后从同一个套接字接收
由于我还在发送,客户端已经收到数据并关闭了套接字。 同时,我正在对该套接字进行选择和接收,它返回 0(因为它已关闭)所以我关闭了这个套接字。但是,发送还没有返回......由于我在这个套接字上调用 close,发送调用失败并出现 EBADF。
我知道客户端已经正确接收到数据,因为我在关闭套接字后输出它并且它是正确的。但是,就我而言,我的 send 调用仍然返回错误 (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() 然后我的发送失败。还没完结?!但是我的客户已经得到了数据!
【问题讨论】:
-
请添加一些代码。可能存在与您怀疑无关的错误。
-
谢谢,我会添加代码
-
总是可以给套接字一个引用计数。
-
@CaptainObvlious 你什么意思?保留参考如何防止错误?我认为同时发送和接收可以吗?