我錯過了什麼?發送成功嗎?
我有非常簡單的客戶端和服務器。服務器使用recv
超時(使用select
)3秒鐘。然後它是shutdown
s和close
的插座和出口。
客戶端連接到服務器,睡30秒併發送非常短的消息。在服務器關閉插座並退出後約27秒。
和send
不會失敗..?爲什麼?爲什麼它不會返回錯誤-1
?
請注意:我削減返回代碼所有檢查並刪除所有日誌,使這個短,我可以。此外,我刪除了所有內容,以縮短這個時間。但它是一個真實的代碼。
客戶端代碼:
int main(int argc, char* argv[])
{
addrinfo hints;
memset(&hints, 0, sizeof hints); // make sure the struct is empty
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
addrinfo *res;
getaddrinfo("127.0.0.1", "1313", &hints, &res);
int nSocketFD = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
assert(-1 != connect(nSocketFD, res->ai_addr, res->ai_addrlen));
freeaddrinfo(res); // free the linked-list, we don't need it anymore
sleep(30);
if(send(nSocketFD, "bla", 4, 0) > 0)
{
printf("Message successfully sent!\n");
}
close(nSocketFD);
return 0;
}
和服務器:
int main()
{
addrinfo hints;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
addrinfo *res; // will point to the results
getaddrinfo(NULL, "1313", &hints, &res);
int nSocketFD = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
bind(nSocketFD, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res); // free the linked-list
listen(nSocketFD, 1);
sockaddr_storage their_addr;
socklen_t addr_size = sizeof(sockaddr_storage);
int nAcceptedSocket = accept(nSocketFD, (sockaddr*)&their_addr, &addr_size);
assert(-1 != nAcceptedSocket);
fd_set fds;
FD_ZERO(&fds);
FD_SET(nAcceptedSocket, &fds);
timeval tv;
tv.tv_sec = 3;
tv.tv_usec = 0;
if(0 == select(nAcceptedSocket + 1, &fds, NULL, NULL, &tv))
{
printf("recv timeout! Exiting..\n");
shutdown(nSocketFD, SHUT_RDWR);
close(nSocketFD);
shutdown(nAcceptedSocket, SHUT_RDWR);
close(nAcceptedSocket);
return 1;
}
assert(false);
return 0;
}
當我執行它,我看到消息recv
超時和成功發送的消息。
對不起,很可能是愚蠢的問題。
這是不正確的。選擇,(e)輪詢可以做到這一點... –
@yi_H'select'等人將返回一個套接字在連接關閉時可讀,但你仍然必須從實際套接字中讀取以獲得該錯誤。 –
OMG(facepalm)(facepalm)(facepalm)我讀了'send'和'recv'的手冊頁,不知何故,我認爲,就像'recv','send'將返回0,以防連接從其他方面:XI認爲今天10h工作就夠了。非常感謝! –