2014-11-24 4 views
-1

Вчера я начал писать код для TCP/IP сервера-клиента для рассылки.Несколько клиентов на сервере C++

Это код сервера:

#include <iostream> 
#include <winsock2.h> 
#pragma comment(lib, "Ws2_32.lib") 

int main() { 
    WSAData wsa; 
    WORD Version = MAKEWORD(2, 1); 

    WSAStartup(Version, &wsa); 

    SOCKET Listen = socket(AF_INET, SOCK_STREAM, 0); 
    SOCKET Connect = socket(AF_INET, SOCK_STREAM, 0); 

    SOCKADDR_IN Server; 

    Server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    Server.sin_family = AF_INET; 
    Server.sin_port = htons(100); 

    bind(Listen, (SOCKADDR*)&Server, sizeof(Server)); 
    listen(Listen, 1); 
    int size = sizeof(Server); 
    char buffer[512]; 
    char *fn = ""; 
    int iResult; 
    std::cout <<"Listening..."; 

    if(Connect = accept(Listen, (SOCKADDR*)&Server, &size)) { 
     std::cout << "\nConnecting was reached :)"; 
    } 


do { 

     char *fn; 

iResult = recv(Connect, buffer, sizeof(buffer), 0); 
if (iResult > 0) { 
buffer[iResult] = '\0'; 
fn = buffer; 
     std::cout << fn; 
} else if (iResult == 0){ 
      printf("Connection closing...\n"); 
     iResult = 0; 
} 


    } while (iResult > 0); 


    WSACleanup(); 
    std::cin.get(); 
    return 0; 
} 

И это для клиента:

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

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

int main() { 
    WSAData wsa; 
    WORD Version = MAKEWORD(2, 1); 

    WSAStartup(Version, &wsa); 

    int iResult; 

    std::string text; 
char buffer[512]; 

    SOCKADDR_IN Client; 

    Client.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    Client.sin_family = AF_INET; 
    Client.sin_port = htons(100); 

    SOCKET Connect = socket(AF_INET, SOCK_STREAM, 0); 

    std::cout << "Wcisnij enter aby polaczyc"; 
    std::cin.get(); 



    if(connect(Connect, (SOCKADDR*)&Client, sizeof(Client))) { 
     std::cout << "Nawiazano polaczeniee"; 
    } 

    do { 

    std::cout << "Waxer: "; 
     std::cin >> text; 
     text.insert(0, "Waxer: "); 
strcpy_s(buffer, text.c_str()); 

// Send an initial buffer 
    iResult = send(Connect, buffer, strlen(buffer), 0); 
    if (iResult == SOCKET_ERROR) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(Connect); 
     WSACleanup(); 
     return 1; 
    } 


    } while(text != "ban"); 

    std::cout<< "Polaczenie wyslane!"; 
    std::cin.get(); 
    return 0; 
} 

Мой вопрос? Что я должен изменить в этом коде для нескольких клиентов. Я имею в виду, как подключать новых клиентов?

ответ

0

Ваш вопрос довольно открытый, но в целом вам нужны темы.

псевдокод:

int main() 
{ 
    std::vector<std::thread> clients; 
    Socket listener("localhost", "1337"); 

    for (;;) 
    { 
    Socket tmp = listener.accept(); 
    clients.push_back(std::thread(&myHandlerFunction, tmp)); 
    clients.back().detach();  
    } 
} 

В конце концов, у вас есть поток для каждого подключенного клиента и может кодифицировать логику чат так, чтобы они могли общаться друг с другом.

+0

Tkanki вы. Но что такое & myHandlerFunction и tmp? И как «получить» сообщение от Клинта, который написал ИТ? – user3599358

+0

Как уже говорилось, псевдокод, вам нужно реализовать все самостоятельно. Этот код должен только демонстрировать, как это работает. * tmp * - это сокет, по которому вы можете общаться с одним клиентом. Я рекомендую вам прочитать хорошую книгу/документацию поверх сокетов или использовать библиотеки, такие как boost :: asio, прежде чем пытаться и программировать ошибки – LMF

+0

Хорошо, я не уверен. Можете ли вы порекомендовать мне хороший учебник для C++ в Windows? – user3599358

Смежные вопросы