2016-07-11 23 views
0

Ich versuche, einen Port-Open-Test mit Sockets zu schreiben und aus irgendeinem Grund meldet "Port offen" für ungültige IP-Adressen. Ich bin derzeit an einen Access Point angeschlossen, der nicht mit dem Internet verbunden ist, daher meldet er fälschlicherweise, dass der Port für externe IP-Adressen offen ist.C Socket/Polling fälschlicherweise POLLOUT-Ereignis zurückgeben?

Zuerst habe ich den Socket eingerichtet und da dies nicht blockierenden Modus ist es in der Regel immer noch von der ersten if Anweisung ausgeführt. Dann lese ich die Steckdose ab. Für einen Socket auf einer externen IP bekomme ich jedoch das POLLOUT-Ereignis, obwohl das nicht möglich scheint ...

Was vermisse ich? Warum enthält die Umfrage, die von Ereignissen empfangen wurde, POLLOUT? Ich habe versucht, die pollfd Struktur vor dem Aufruf der Umfrage erneut zurücksetzen, aber das hat das Ergebnis nicht geändert.

result = connect(sd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); 

if(result == 0) //woohoo! success 
{ 
    //SUCCESS! 
    return true; 
} 
else if (result < 0 && errno != EINPROGRESS) //real error 
{ 
    //FAIL 
    return false; 
} 

// poll the socket until it connects 
struct pollfd fds[1]; 
fds[0].fd = sd; 
fds[0].events = POLLOUT | POLLRDHUP | POLLERR | POLLNVAL; 
fds[0].revents = 0; 

while (1) 
{ 
    result = poll(fds, 1, 1); 

    if (result < 1) 
    { 
     //Poll failed, mark as FAIL 
    } 
    else 
    { 
     // see which event occurred 
     if (fds[0].revents & POLLOUT || fds[0].revents & POLLRDHUP) 
     { 
      //SUCCESS 
     } 
     else if (fds[0].revents & POLLERR || fds[0].revents & POLLNVAL) 
     { 
      //FAIL 
     } 
    } 
} 
+0

Ich bin nicht verrückt nach der Code-Struktur und Fehlerprüfung hier. Wenn die Verbindung erfolgreich ist oder kein EINPROGRESS verursacht, sollten Sie die Auswahlschleife überhaupt nicht aufrufen. und 'poll()' verursacht kein EINPROGRESS. Sie müssen dies aufräumen und es erneut versuchen. Sie sollten auch SO_ERROR auf dem Socket FD überprüfen, wenn Sie den EPOLLOUT erhalten. – EJP

+0

@EJP du hast Recht. Löschte meine Antwort und entschuldigte mich für den Streit. Ich habe weitere Lektüre und Experimente durchgeführt und festgestellt, dass mein Beispiel fehlerhaft war. Wie auch immer, danke, habe heute etwas gelernt! – pah

+0

@EJP sehe meine Bearbeitung. Ich habe die Fehlerüberprüfung bereinigt und jetzt überprüfe ich SO_ERROR nach EPOLLOUT – kburbach

Antwort

0

Ich brauchte SO_ERROR nach Erhalt des POLLOUT Ereignisses zu überprüfen - POLLOUT selbst Erfolg nicht an.

//now read the error code of the socket 
int errorCode; 
uint len = sizeof(errorCode); 
result = getsockopt(fds[0].fd, SOL_SOCKET, SO_ERROR, 
       &errorCode, &len);