我讀到它應該是安全的,從不同的線程併發,但我的程序有一些奇怪的行爲,我不知道什麼是錯的。發送和接收來自不同線程的相同套接字不起作用
我有併發線程與客戶端插座
- 一個通信做着發送到插座
- 做一個選擇,然後從同一插座
的recv因爲我仍然在發,客戶端已經收到數據並關閉了套接字。 同時,我在該套接字上做了select和recv,它返回0(因爲它是關閉的),所以我關閉了這個套接字。但是,發送還沒有返回...因爲我在這個套接字上調用close,所以發送調用失敗,EBADF。
我知道客戶端已經收到了正確的數據,因爲我關閉套接字後輸出它,它是正確的。但是,在我的最後,我的發送調用仍然返回一個錯誤(EBADF),所以我想修復它,所以它不會失敗。
這並非總是如此。它可能有40%的時間發生。我不會在任何地方使用睡眠。我應該暫停發送或recvs或任何東西?
下面是一些代碼:
發送:
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() 然後我的發送失敗。它還沒有完成?!但我的客戶已經收到了數據!
請添加一些代碼。可能有錯誤與您懷疑的內容無關。 – user1952500 2013-03-12 23:22:25
謝謝,我將添加代碼 – yuf 2013-03-12 23:22:50
總是可以給套接字引用計數。 – 2013-03-12 23:36:44