2017-09-21 11 views
-1

8080ポートでリッスンする単純なTCPサーバが作成され、接続が確立されるとクライアントにメッセージが送信されます。ここにコードがあります。クライアント側の端末にWinsockサーバのメッセージが表示されない

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

} 

私がこれを実行しているとき、サーバーはうまく動作します。別のターミナルを開いてtelnetを開き、8080ポートのサーバーに接続しようとします。これはクライアント側の端末です。

Welcome to Microsoft Telnet Client 

Escape Character is 'CTRL+]' 

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

これはサーバー側です。

Listening for incoming connection 

Connection established 

しかし、サーバーに接続が確立された後であっても、クライアント側は「ローカルホストへの接続」にとどまります。私は "私たちに連絡してくれてありがとうございますが、\ n"というメッセージを送っていますが、クライアント側には表示されません。何が間違っている可能性がありますか?

+0

だろう(プロトコルは[RFC854](https://tools.ietf.org/html/rfc854)で記述されています)。テスト目的のために、自分のクライアントを構築するほうがよいでしょう。 –

答えて

-1

これは明らかに間違っていました。

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

私は(S、(sockaddr構造体の*)&クライアント、new_socketを初期化した後& Cを受け入れ、不等式がaccept関数の戻り値に適用されていた= new_socketの上に別のブラケットを入れていないので。

正しい構文は、telnetは単なる生のセンド/バイトチャネルを受信しないので、あなたのTelnetクライアントは、おそらくそれはWH送信オプションにいくつかの応答を待っている

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

あなたがシステムコール、特に 'send()'をエラーチェックするのに気をつけていたら、すぐにこの問題を見つけたでしょう。このようなコードは書かないでください。 – EJP

関連する問題