2017-01-09 24 views
1

この単純なサーバークライアントプログラムをwinsockを使用して実行しようとしています。サーバーはクライアント接続を受け付けていますが、クライアントが送信したデータは受信できません。私は問題を見つけるのに苦労している。Winsockシンプルクライアントサーバーで受信が失敗する

SERVER:

#define _WINSOCK_DEPRECATED_NO_WARNINGS 

#include<iostream> 
#include<winsock2.h> 

#pragma comment(lib,"ws2_32.lib") 

#define DEFAULT_PORT 18000 

int main(int argc, char *argv[]) 
{ 
    WSADATA wsa; 
    SOCKET s, new_socket; 
    struct sockaddr_in server, client; 
    char *message, client_msg[2000]; 
    int port, c, recv_size; 

    if (argc > 2) 
    { 
     std::cout << "usage : " << argv[1] << " <PORT>\n"; 
     std::cout << "If no port is given then default port is used.\n"; 
     std::cout << "DEFAULT PORT : 18000\n"; 
     return 1; 
    } 
    if (argc == 2) 
    { 
     port = atoi(argv[2]); 
    } 
    else 
    { 
     port = DEFAULT_PORT; 
    } 

    std::cout << "Initializing Winsock..."; 
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
    { 
     std::cout << "Failed. Error code" << WSAGetLastError(); 
     return 1; 
    } 
    std::cout << "Initialized.\n\n"; 

    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
    { 
     std::cout << "Could not create Socket : " << WSAGetLastError() << "\n"; 
     return 1; 
    } 
    std::cout << "Socket Created.\n"; 

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

    if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) 
    { 
     std::cout << "Bind failed with error code : " << WSAGetLastError() << "\n"; 
    } 
    std::cout << "Bind done.\n"; 


    listen(s, 3); 

    std::cout << "Waiting for incoming connections...\n"; 

    while (true) 
    { 
     c = sizeof(struct sockaddr_in); 

     new_socket = accept(s, (struct sockaddr*)&client, &c); 
     if (new_socket == INVALID_SOCKET) 
     { 
      closesocket(new_socket); 
      std::cout << "Accept failed with error code : " << WSAGetLastError() << "\n"; 
     } 
     else 
     { 
      std::cout << "Connection accepted.\n"; 

      if ((recv_size = recv(s, client_msg, 200, 0)) == SOCKET_ERROR) 
      { 
       closesocket(new_socket); 
       std::cout << "Receive Failed.\n\n"; 
      } 
      else 
      { 
       if (strcmp(client_msg, "PASSWD")) 
       { 
        message = "HELLO!"; 
        send(new_socket, message, strlen(message), 0); 
       } 
       else 
       { 
        message = "Authentication failed!"; 
        send(new_socket, message, strlen(message), 0); 
        closesocket(new_socket); 
       } 
      } 
     } 
    } 

    closesocket(s); 
    WSACleanup(); 


    return 0; 
} 

CLIENT:

#define _WINSOCK_DEPRECATED_NO_WARNINGS 

#include<iostream> 
#include<winsock2.h> 

#pragma comment(lib,"ws2_32.lib") 

#define DEFAULT_SERVER "127.0.0.1" 
#define DEFAULT_PORT 18000 
#define PASSWORD "PASSWD" 

int main(int argc, char *argv[]) 
{ 
    WSADATA wsa; 
    SOCKET s; 
    struct sockaddr_in server; 
    char *message, server_reply[2000], *server_addr; 
    int recv_size, port = DEFAULT_PORT; 

    if (argc > 4) 
    { 
     std::cout << "usage : " << argv[0] << " <Server IP> <Server Port> [DATA]\n\n"; 
     std::cout << "If any argument is missing, default values will be used.\n"; 
     std::cout << "Default Address : localhost (127.0.0.1)\nDefault Port : 18000\nDefault DATA: 'PASSWD'\n\n"; 
     return 1; 
    } 
    else if (argc == 4) 
    { 
     server_addr = argv[1]; 
     port = atoi(argv[2]); 
     message = argv[3]; 
    } 
    else if (argc == 3) 
    { 
     server_addr = argv[1]; 
     port = atoi(argv[2]); 
     message = PASSWORD; 
    } 
    else if (argc == 2) 
    { 
     server_addr = argv[1]; 
     port = DEFAULT_PORT; 
     message = PASSWORD; 
    } 
    else 
    { 
     server_addr = DEFAULT_SERVER; 
     port = DEFAULT_PORT; 
     message = PASSWORD; 
     //server_addr = "127.0.0.1"; 
     //port = 2222; 
     //message = "HELLO"; 
    } 

    std::cout << "Initialising Winsock..\n"; 
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
    { 
     std::cout << "Failed.. Error Code : " << WSAGetLastError() << "\n"; 
     return 1; 
    } 
    std::cout << "Winsock Initialised.\n"; 

    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
    { 
     std::cout << "Could not create socket : " << WSAGetLastError() << "\n"; 
    } 
    std::cout << "Socket Created.\n"; 

    server.sin_addr.s_addr = inet_addr(server_addr); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(port); 

    if (connect(s, (struct sockaddr*)&server, sizeof(server)) < 0) 
    { 
     std::cout << "Could not connect to " << server_addr << " on port " << port << ".\n"; 
     WSACleanup(); 
     return 1; 
    } 
    std::cout << "Connected to " << server_addr << " on port " << port << ".\n\n"; 

    if (send(s, message, strlen(message), 0) < 0) 
    { 
     std::cout << "Sending Data failed.\n"; 
     WSACleanup(); 
     return 1; 
    } 
    std::cout << "Data send.\n\n"; 

    //Sleep(500); 

    if ((recv_size = recv(s, server_reply, 20, 0)) == SOCKET_ERROR) 
    { 
     std::cout << "Receive Failed.\n\n"; 
    } 
    else 
    { 


     server_reply[recv_size] = '\0'; 

     std::cout << server_addr << " : " << server_reply << "\n"; 

    } 
    //Sleep(5000); 

    closesocket(s); 
    WSACleanup(); 

    return 0; 
} 

任意の助けをいただければ幸いです。ありがとう。

+1

問題点の1つは、strcmp()が、ヌルで終了する文字列を期待していることです。それとは別に、間違っていることを説明しない限り、私たちは助けられません。あなたはエラーを受け取っていますか? –

+0

申し訳ありませんが、私のコードは多くのコメントなしでひどくフォーマットされています。私は事務所が終了した後に必要な箇所にコメントを記入する。 私がしようとしていることは、サーバーがポートで待機し、クライアントが接続し、最初に送信するメッセージがプレーンテキストの秘密鍵であることです。サーバーはメッセージを受信し、キーが一致する場合は接続を開いたままにします。そうでない場合は接続を閉じます。私の計画は、後で複数の接続にスレッドを追加し、これをイベントディスパッチシステムに拡大することです。後でラズベリーパイをセットアップに追加し、IOTハブからシンプルにします。 – windlessStorm

+0

あなたは何をしようとしているのか尋ねなかったので、何がうまくいかないのか尋ねました。しかし、私はJunが主な問題を発見したと考えています。サーバーは 'new_socket'から読み込むべきときに' s'から読み込もうとしています。 –

答えて

1

((recv_size = RECV(S、client_msg、200、0))== SOCKET_ERROR)

変更のサーバーサイドコードでnew_socketする場合。

+0

と言って、 'recv_size'を利用する必要があります。私は、メッセージがサーバー固有のポートで受信されると考えていたので、サーバーは自分のソケットを聴いているはずです。私はrecvについてもっと読むべきだった。 – windlessStorm

関連する問題