爲什麼socket()
沒有返回INVALID_SOCKET
?我認爲它會失敗,然後我可以退出我的功能。我的函數的錯誤檢查一直持續到recvfrom()
,然後在沒有互聯網連接時掛起。我以爲socket()
或sendto()
會返回一個錯誤代碼,當我沒有互聯網連接,但他們不是。我試圖依靠他們的失敗作爲一個標誌,用戶沒有互聯網連接並退出我的功能,但這只是不工作的一些奇怪的原因。當沒有互聯網連接時,socket()和sendto()不返回錯誤代碼
void myFunc()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("myipaddress");
server_addr.sin_port = htons(123);
// Doesn't fail when there's no internet connection
protoent *proto = getprotobyname("udp");
int s = socket(PF_INET, SOCK_DGRAM, proto->p_proto);
if (s == INVALID_SOCKET) {
goto Cleanup;
}
// Doesn't fail when there's no internet connection
char msg[48] = { 0x08, 0, 0, 0, 0, 0, 0, 0, 0 };
int iResult = sendto(s, msg, sizeof(msg), 0, (struct sockaddr *) &server_addr, sizeof(server_addr));
if (iResult == SOCKET_ERROR) {
goto Cleanup;
}
// Hangs when there's no internet connection
memset(msg, 0, sizeof(msg));
struct sockaddr saddr;
socklen_t saddr_l = sizeof(saddr);
iResult = recvfrom(s, msg, 48, 0, &saddr, &saddr_l);
if (iResult == SOCKET_ERROR) {
goto Cleanup;
}
Cleanup:
closesocket(s);
WSACleanup();
}
風格問題 - 您可以通過使用RAII技術來清除那些'goto Cleanup;'調用,其中清理將在函數返回時自動發生。 – PaulMcKenzie
@PaulMcKenzie是的,但假設'myFunc()'的用戶會一直足夠體貼/記住在使用該函數後進行清理。 – Merl
你會如何定義「沒有互聯網連接」?請注意,您使用的數據報套接字定義不可靠。 –