2017-09-21 10 views
-1

J'ai créé un serveur TCP simple qui écoute sur le port 8080 qui envoie un message au client une fois qu'une connexion est établie. Voici le code.Le message du serveur Winsock n'apparaît pas sur le terminal côté client

#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; 

} 

Lorsque j'exécute cela, le serveur tourne très bien. J'ouvre un autre terminal et ouvre telnet et essaie de se connecter au serveur sur le port 8080. C'est le terminal côté client.

Welcome to Microsoft Telnet Client 

Escape Character is 'CTRL+]' 

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

Et c'est le côté serveur. Mais même après que le serveur a indiqué qu'une connexion est établie, le client reste à "Connecting to localhost". J'envoie le message "Merci de vous connecter à nous mais je dois y aller \ n" mais il ne s'affiche pas du côté client. qu'est-ce qui peut éventuellement être mauvais?

+0

Depuis telnet est non seulement une émission/réception brut canal octets, votre client telnet attend probablement une réponse aux options qu'il envoie wh ile essayant de se connecter (le protocole est décrit par [RFC854] (https://tools.ietf.org/html/rfc854). À des fins de test, il vaut probablement mieux construire votre propre client. –

Répondre

-1

Apparemment, c'était une erreur stupide.

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

Comme je ne l'ai pas mis un autre support sur la new_socket = accepte (s, (struct sockaddr *) client &, & c après l'initialisation new_socket, l'inégalité a été appliquée sur le

retour de la fonction accept.

La syntaxe correcte serait

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

Si vous aviez pris la peine de vérifier vos appels système, en particulier 'send()', vous auriez trouvé ce problème immédiatement. N'écris pas de code comme ça. – EJP