我有一個連接到某個服務器的應用程序。它可以同步發送數據(發送和等待應答)和異步接收數據。 我做了2個線程。在無限循環的第一個線程中,我發送數據並等待答案。在第二個線程中,我正在從服務器獲取數據,並將它們推送到隊列中。 但是,如果我發送數據時發生了一些錯誤(在第一個線程中),我必須關閉套接字。我該如何檢查第二個線程是否關閉了套接字?檢查插座關閉
代碼在第二個線程:
while (processing) {
nbytes = recv(socketDesc, canFrame, sizeof(data), 0);
if (nbytes > 0) {
push_queue(data);
}
if (nbytes < 0) {
throw "Error in read data from socket!";
}
}
如果我關閉套接字在第一個線程在第二個線程功能recv
不採取錯誤。現在我用的超時,這樣的:
setsockopt(this->socketDesc, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
setsockopt(this->socketDesc, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv));
當我不從服務器獲取答案(第一線程)我設置變量processing
爲false,超時後(在功能recv
)循環是錯誤發生結束。我是否可以在功能recv
中同時檢查套接字是否關閉?
你如何關閉套接字?使用close()?你有沒有嘗試過使用shutdown()?shutdown()可以選擇丟棄未決的讀取和/或寫入數據,因此可能有所幫助。 –