它不是真的重複。當使用非阻塞套接字時,你必須使用select方法來檢查連接是否被創建,在select方法中你可以設置一個超時值來終止。比方說,如果我想在預設的超時值之前中斷選擇方法,那又是同樣的問題。在我的情況下,選擇超時時間最長可達5分鐘,以防打印機忙於做某些事情而沒有時間回覆。break tcpip連接方法
從另一個線程關閉套接字取消連接,或選擇,似乎是我的問題的最佳解決方案。
我有程序連接到遠程TCPIP端口,它是一臺打印機。
SOCKET socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in SockAddr;
//... initialized host and port and so on
int iret = connect(socket, &SockAddr, sizeof(SockAddr));
if (iret != 0)
{
// get error code...
}
只要打印機打開,它工作正常。如果打印機關閉,連接將失敗,並且「主機不可達」,這也很好。
如果打印機處於關閉狀態,連接方法將被阻止約20到21秒,然後返回失敗。這20秒應該從一些系統配置中計算出來,這很可能但很難改變。在其他系統上,這可能會更長。
我的問題是,是否有可能從連接方法,通過從另一個線程的另一個調用中斷?如果我發現打印機未打開,我想取消連接,不要停止應用程序,而是繼續執行一些日誌記錄作業。
如果我在進程中附加調試,暫停然後繼續,它似乎會提前中斷。
我不能在這裏使用非塊套接字,因爲它是一個非常大的項目,其他一切都是由其他人設計的塊套接字。我不允許做大的改變。
什麼是「tcpip端口」?有TCP和IP。兩者都是不同的網絡層。 – Olaf
@Olaf過於迂腐 - 將兩者結合在一起稱爲TCPIP – Alnitak
@Alnitak:「數以百萬計的蒼蠅不會錯:吃sh **」:-)認真地說:僅僅因爲使用錯了並不意味着它應該是。混淆網絡層是導致錯誤觀念和問題的常見原因。 (它會過於迂腐,但要問什麼「tcpip」,因爲它通常被稱爲「TCP/IP」)。 – Olaf