-3
我試圖爲connect()函數設置自己的時間。Winsock C++連接超時
我的代碼以這樣的默認連接工作得很好:
bool connectFUNC4(char * ipaddr) {
WSADATA wsa;
struct sockaddr_in server;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
return false;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
return false;
server.sin_addr.s_addr = inet_addr(ipaddr);
server.sin_family = AF_INET;
server.sin_port = htons(5577);
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
return false;
return true;
}
我理解的想法與阻塞和不阻止連接,我已經找到解決方案與設置爲非阻塞模式和超時。它總是成功,但通信不起作用。
bool connectFUNC3(char * ipaddr) {
WSADATA wsa;
struct sockaddr_in server;
server.sin_addr.s_addr = inet_addr(ipaddr);
server.sin_family = AF_INET;
server.sin_port = htons(5577);
unsigned long block = 1;
ioctlsocket((unsigned int)sock, FIONBIO, &block);
WSAGetLastError();
int ret = connect(sock, (struct sockaddr *)&server, sizeof(server));
timeval time_out;
time_out.tv_sec = 5;
time_out.tv_usec = 0;
fd_set setW, setE;
FD_ZERO(&setW);
FD_SET(sock, &setW);
FD_ZERO(&setE);
FD_SET(sock, &setE);
select(0, NULL, &setW, &setE, &time_out);
bool flag;
if (FD_ISSET(sock, &setW))
{
// connection successful
flag = true;
}
else if (FD_ISSET(sock, &setE))
{
// connection fail
flag = false;
}
else
{
// connection timeout
flag = false;
}
block = 0;
ioctlsocket((unsigned int)sock, FIONBIO, &block);
return flag;
}
請幫助,使其工作,或者找到另一種解決方案(多線程不可用在我的情況)。謝謝。
你似乎有這個答案的修改版本:https://stackoverflow.com/a/2597774/4581301我建議俯瞰答案和理由或採用差異。例如,你應該遵循他們的例子,並檢查'select'上的返回碼。 – user4581301
'通信不起作用'不是問題描述。再試一次。 – EJP
不工作意味着我的代碼連接後發送4個字節的請求,並收到14個字節的答案。與connectFUNC4它工作weel,但與FUNC3沒有通信wireshark檢測到。 – Dmitriy