2017-01-09 16 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; 
} 

КЛИЕНТ:

#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

Одна из проблем заключается в том, что strcmp() ожидает строку с завершающим нулевым символом, которая не является тем, что вы предоставили ей. Кроме того, мы не сможем помочь, если вы не объясните * точно, что происходит не так - вы получаете ошибку, recv никогда не возвращается, или что? –

+0

Извините, мой код плохо отформатирован без большого количества комментариев. Я буду добавлять комментарии, когда это необходимо, после окончания работы. Именно то, что я пытаюсь сделать, - это сервер, который слушает порт, клиенты подключаются, и первое отправленное им сообщение является секретным ключом в виде обычного текста. Сервер получает сообщение и сохраняет соединение открытым, если ключ совпадает или закрывает его. Мой план состоит в том, чтобы добавить поток для нескольких соединений позже и масштабировать его в систему диспетчеризации событий. Позже добавьте малину pi в настройку и сделайте простой с нуля IOT Hub. – windlessStorm

+0

Я не спрашивал, что вы пытаетесь сделать, я спросил, что происходит не так. Но я думаю, что Jun нашел основную проблему - сервер пытается читать с 's', когда он должен читать из' new_socket'. –

ответ

1

если ((recv_size = RECV (s, client_msg, 200, 0)) == SOCKET_ERROR)

Изменение s к new_socket в вашей стороне сервера кода.

+0

Спасибо, сейчас он работает. Я думал, что сообщение получает на серверный порт, поэтому сервер должен слушать свой собственный сокет. Я должен был прочитать больше о recv. – windlessStorm