我有一個簡單的服務器/客戶端程序,我正在處理。我正在使用select()
等待數據在讀取之前進入TCP套接字。當數據進入時,我使用幾個recv()
和select()
調用來讀取塊,直到我擁有了全部數據。然後,我循環回到最初的select()
調用,並查看客戶端是否有其他要發送的內容。套接字選擇()第二次阻塞
struct timeval timeoutCounter;
fd_set readFileDescriptor;
do {
timeoutCounter.tv_sec = 30;
timeoutCounter.tv_usec = 0;
FD_ZERO(&readFileDescriptor);
FD_SET(socket, &readFileDescriptor);
cout << "This line always prints, every iteration through the loop.\n";
dataReady = select(socket+1,&readFileDescriptor,NULL,NULL,&timeoutCounter);
cout << "This line only prints the first time I call select()."
<< "The second time it hangs before reaching this line.\n";
// ... recv(), select(), recv(), select(), etc in a loop until I have all the data
// send() a response to the client
} while(dataReady > 0);
我開始了與所有這一切都在一個大,難以讀取功能,和它的工作。然後我把它分解成一個獨立的類,與accept()
的聯繫,現在它的行爲是不同的。用戶發送的第一個數據集正常。但客戶端等待來自服務器的響應,然後將第二組數據發送到套接字。但是,客戶端發送第二組數據後,select()
不會返回;它阻塞,直到它超時。
我已經認定客戶是問題所在;數據包會在適當的時候正常發送。我也嘗試打印套接字文件描述符來證明它不會在某處發生更改。有誰知道爲什麼這段代碼可能不起作用嗎?可能導致select()
阻止的因素有哪些?
編輯:它看起來像我的代碼運行在32位機器很好,但未能在64位機器。我仍然沒有解決這個問題,但是這個問題縮小了一點。
像某人的聲音正在破壞'socket'變量。嘗試使用strace(1)運行服務器,以確保選擇和recv的所有參數都符合您的期望。或者單步調試器中的服務器,檢查系統調用參數 –