[英]FD_SET Problem/Networking
嗨,現在我想知道客戶端或服務器是否斷開連接,然后發送錯誤,但我似乎無法讓它工作,我不知道該怎么做,所以我真的需要幫助
這是我的代碼
#ifdef _WIN32 || _WIN64
if(select(0,&fd_read,NULL,&fd_close,&time)==-1){
printf("Error in Select()");
return 0;
}
#else
if(select(sockMax + 1,&fd_read,NULL,&fd_close,&time)==-1){
printf("Error in Select()");
return 0;
}
#endif
if(FD_ISSET(socklisten,&fd_read)){
}
else
{
dopack(&pkt);
send(socklisten, (char*)&pkt, sizeof(pack), 0);
}
//this is where the error shows -----------
if(FD_SET(socklisten,&fd_close))
{
backtoMenu = true;
}
FD_ZERO(&fd_leer);
FD_SET(sockEscucha,&fd_leer);
該錯誤在“do”之前表示預期的主要表達式,所以是的,我不知道這意味着什么,以防萬一我是這樣聲明 fd_read 和 fd_close
fd_set fd_read;
fd_set fd_close;
請提供任何幫助將不勝感激 tyvm
此外,Richard 所說的,第三個傳遞給select()
的fd_set
不是關於關閉的 FD,而是關於一些需要特別注意的異常情況(確切地說,是由底層驅動程序定義的,例如 TCP sockets 將其用於“緊急”數據。
您通過recv()
的返回代碼檢測到遠程關閉,即在可讀描述符的處理中。 如果 stream 套接字上的recv()
返回 0,則遠程端已關閉連接(使用 TCP,您仍然可以發送數據,因為只有一個方向關閉); 如果recv()
返回 -1,則errno
有更多信息,例如 ECONNRESET 表示收到了 TCP RST 數據包。
你想使用 if(FD_ISSET(...
要確定客戶端是否已關閉,您需要從活動的 readfd 中讀取並查看讀取是否返回零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.