Ich versuche, meine eigene Zeit für die Funktion connect() einzustellen.Winsock C++ Verbindungszeitüberschreitung
mein Code funktioniert gut mit Standard-Verbindung wie folgt aus:
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;
}
I Idee verstehen mit blockierenden und nicht die Verbindung zu blockieren, und ich habe festgestellt Lösung nicht blockierenden Modus und Timeout bei der Einstellung. Es endete immer erfolgreich, aber die Kommunikation funktioniert nicht.
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;
}
Bitte helfen Sie es zu arbeiten, oder eine andere Lösung zu finden (Multithread nicht in meinem Fall verwendbar). Vielen Dank.
Sie scheinen eine modifizierte Version dieser Antwort zu haben: https://stackoverflow.com/a/2597774/4581301 empfehle ich die Antwort über und zu rechtfertigen oder zu erlassen suchen die Unterschiede. Zum Beispiel sollten Sie ihrem Beispiel folgen und den Rückgabecode auf 'select' überprüfen. – user4581301
"Kommunikation funktioniert nicht" ist keine Problembeschreibung. Versuch es noch einmal. – EJP
Nicht arbeiten bedeutet, dass mein Code nach der Verbindung 4 Byte Anfrage senden und 14 Bytes beantworten. mit connectFUNC4 funktioniert es weel, aber mit FUNC3 wurde keine Kommunikation von wireshark erkannt. – Dmitriy