2017-09-21 7 views
-1

Ich erstellte einen einfachen TCP-Server auf 8080-Port überwachen, die eine Nachricht an den Client sendet, sobald eine Verbindung hergestellt ist. Hier ist der Code.Winsock-Server-Nachricht wird nicht auf Clientseite angezeigt Terminal

#include <iostream> 
#include <winsock2.h> 
#pragma comment(lib, "ws2_32.lib") 
#pragma warning(disable:4996) 

int main(int argc, char* argv[]) { 
    WSADATA wsa; 
    SOCKET s, new_socket; 
    int c; 
    int ret; 
    struct sockaddr_in server, client; 
    char* message = "Thank you for connecting to us but i got to go\n"; 

    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { 
     printf("Failed to initialize Winsock : %d", WSAGetLastError()); 
     return 1; 
    } 



    s = socket(AF_INET, SOCK_STREAM, 0); 
    if (s == INVALID_SOCKET) { 
     printf("Error creating socket : %d", WSAGetLastError()); 

    } 


    server.sin_family = AF_INET; 
    server.sin_port = htons(8080); 
    server.sin_addr.s_addr = INADDR_ANY; 


    if (bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) { 
     printf("Error binding socket : %d\n", WSAGetLastError()); 
     exit(EXIT_FAILURE); 
    } 

    listen(s, 3); 

    puts("Listening for incoming connection\n"); 
    c = sizeof(struct sockaddr_in); 
    while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET) { 
     puts("Connection established\n"); 
     send(new_socket, message, strlen(message), 0); 
    } 

    if (new_socket == INVALID_SOCKET) { 
     printf("Connection failed : %d", WSAGetLastError()); 
     return 1; 
    } 

    closesocket(s); 
    WSACleanup(); 


    return 0; 

} 

Wenn ich dies ausführen, läuft der Server ganz gut. Ich öffne ein anderes Terminal und öffne telnet und versuche mich mit dem Server am 8080 Port zu verbinden. Dies ist das Client-seitige Terminal.

Welcome to Microsoft Telnet Client 

Escape Character is 'CTRL+]' 

Microsoft Telnet> open localhost 8080 
Connecting To localhost... 

Und das ist die Serverseite.

Aber auch nachdem der Server sagt, dass eine Verbindung hergestellt wurde, bleibt die Clientseite bei "Connecting to localhost". Ich sende die Nachricht "Vielen Dank für die Verbindung zu uns, aber ich muss gehen \ n", aber es zeigt sich nicht auf der Client-Seite. Was kann möglicherweise falsch sein?

+0

Seit telnet nicht nur roh send/Empfangs Bytes Kanal, Telnet-Client für einige Reaktion auf die Optionen wäre es wahrscheinlich warten wh schicken Ich versuche zu verbinden (das Protokoll wird von [RFC854] (https://tools.ietf.org/html/rfc854) beschrieben. Zu Testzwecken ist es wahrscheinlich besser, einen eigenen Client zu erstellen. –

Antwort

-1

Wie es scheint, war es ein dummer Fehler.

while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET) 

Da ich keine andere Konsole über den new_socket gelegt hat = akzeptieren (s, (struct sockaddr *) & Client, & c nach new_socket initialisiert wurde die Ungleichheit bei der Rückkehr accept Funktion angewendet wird.

Die korrekte Syntax

while ((new_socket = accept(s, (struct sockaddr*)&client, &c)) != INVALID_SOCKET) 
+0

Wenn Sie Ihre Systemaufrufe, speziell 'send()', auf Fehler überprüft hätten, hätten Sie dieses Problem sofort selbst gefunden. Schreibe keinen Code wie diesen. – EJP

Verwandte Themen