accept(ListenSocket, NULL, NULL) hängt



  • Hallo,

    Eine Frage zu diesem Winsock Server-Beispiel:
    https://msdn.microsoft.com/de-de/library/windows/desktop/ms737593(v=vs.85).aspx

    Beim Testen mit einem e-mail client hängt es bei accept(...):

    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
    err_msg(hWnd, "accept", itxtY, WSAGetLastError(), TRUE);
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
    }

    //Erst nach Abbruch der Übertragung durch den Client geht es hier weiter.

    do {
    iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);

    ...

    Der Client gibt eine Fehlermeldung aus, das er vom Server kein "OK" erhält.

    WSAGetLastError() gibt im gesamten Programmverlauf 0 (kein Fehler).
    Die Firewall ist für den Server geöffnet.

    Fehlen hier zusätzliche Konfigurationseinstellungen?

    Gruß!
    KS



  • Lösung:
    Man muß einem E-mail-Client nach jedem Eingang eine Antwort zurückgeben, damit er weiter sendet:

    int svr::SendResponse(SOCKET ClientSocket, int iResponseType)
    {
    char buf[100];
    int len;
    if (iResponseType == 220)
    sprintf_s(buf, "220 %s Welcome to %s %s \r\n", "LCD", "eml", "1.0");
    else if (iResponseType == 221)
    strcpy_s(buf, "221 Service closing transmission channel\r\n");
    else if (iResponseType == 250)
    strcpy_s(buf, "250 OK\r\n");
    else if (iResponseType == 354)
    strcpy_s(buf, "354 Start mail input; end with <CRLF>.<CRLF>\r\n");
    else if (iResponseType == 501)
    strcpy_s(buf, "501 Syntax error in parameters or arguments\r\n");
    else if (iResponseType == 502)
    strcpy_s(buf, "502 Command not implemented\r\n");
    else if (iResponseType == 503)
    strcpy_s(buf, "503 Bad sequence of commands\r\n");
    else if (iResponseType == 550)
    strcpy_s(buf, "550 No such user\r\n");
    else if (iResponseType == 551)
    strcpy_s(buf, "551 User not local. Can not forward the mail\r\n");
    else
    sprintf_s(buf, "%d No description\r\n", iResponseType);

    len = (int)strlen(buf);
    
    
    send(ClientSocket, buf, len, 0);
    
    return iResponseType;
    

    }