2014-12-27 62 views
1

我正在尝试创建一个与2个客户端进行会话的服务器,每次都有1个客户端。与一个客户端通话后,服务器向两个客户端发送消息。 我发现了一个服务器的基本代码,我试着将其升级为接受多个连接数,我看到了两种方法:线程或者插入数组,但我无法理解它。 有人可以解释我如何使用线程并举例吗? 这是代码:改进服务器以处理多个客户端

int main() 
{ 
    WSADATA WsaDat; 
    if (WSAStartup(MAKEWORD(2, 2), &WsaDat) != 0) 
    { 
     std::cout << "WSA Initialization failed!\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (Socket == INVALID_SOCKET) 
    { 
     std::cout << "Socket creation failed.\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    SOCKADDR_IN serverInf; 
    serverInf.sin_family = AF_INET; 
    serverInf.sin_addr.s_addr = INADDR_ANY; 
    serverInf.sin_port = htons(8888); 

    if (bind(Socket, (SOCKADDR*)(&serverInf), sizeof(serverInf)) == SOCKET_ERROR) 
    { 
     std::cout << "Unable to bind socket!\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    listen(Socket, 1); 

    SOCKET TempSock = SOCKET_ERROR; 
    while (TempSock == SOCKET_ERROR) 
    { 
     std::cout << "Waiting for incoming connections...\r\n"; 
     TempSock = accept(Socket, NULL, NULL); 
    } 

    // If iMode!=0, non-blocking mode is enabled. 
    u_long iMode = 1; 
    ioctlsocket(Socket, FIONBIO, &iMode); 

    Socket = TempSock; 
    std::cout << "Client connected!\r\n\r\n"; 

    // Main loop 
    for (;;) 
    { 
     char *szMessage = "Welcome to the server!\r\n"; 
     send(Socket, szMessage, strlen(szMessage), 0); 

     int nError = WSAGetLastError(); 
     if (nError != WSAEWOULDBLOCK&&nError != 0) 
     { 
      std::cout << "Winsock error code: " << nError << "\r\n"; 
      std::cout << "Client disconnected!\r\n"; 

      // Shutdown our socket 
      shutdown(Socket, SD_SEND); 

      // Close our socket entirely 
      closesocket(Socket); 

      break; 
     } 

     Sleep(1000); 
    } 

    WSACleanup(); 
    system("PAUSE"); 
    return 0; 
} 

回答

0

要做到这一点,你需要一个服务器插座和ClientSocket的阵列这样的:

SERVER:

ACCEPT: 
int clientsock[2]; 
minsocks = 0; 
numsocks = 2; 
while(minsock < numsocks) 
{ 
    clientsock[minsock] = accept(serversock, 
    (struct sockaddr *) &clientaddr, 
    (socklen_t *)&clientaddrlen); 
    minsock++; 
} 


RECIEVE: 


char message[6]; 
int data; 
int limit = 6; 
for(int i = 0; i < NUMSOCK; i++) 
{ 
    int in = recv(clientsock[i], &message[index], limit, 0); 
    if(in > 0) 
    { 
     index += in; 
     limit -= in; 
    } 
    else if (in == 0) 
     printf("Connection closed\n"); 
    else 
     printf("recv failed: %d\n", WSAGetLastError()); 
} 

这应该是一个良好的开端你先开始。

帖子 - C版

pthread_t sniffer_thread; 
if(pthread_create(&sniffer_thread , NULL , connection_handler , (void*) new_sock) < 0) 
    { 
     perror("could not create thread"); 
     return 1; 
    } 

    //Now join the thread , so that we dont terminate before the thread 
    //pthread_join(sniffer_thread , NULL); 
    puts("Handler assigned"); 
} 

/* 
* This will handle connection for each client 
* */ 
void *connection_handler(void *socket_desc) 
{ 
    //Get the socket descriptor 
    int sock = *(int*)socket_desc; 
    int read_size; 
    char *message , client_message[2000]; 
    while(in != 0) 
    { 
     int in = recv(socket_desc, &client_message[index], limit, 0); 
     if(in > 0) 
     { 
      index += in; 
      limit -= in; 
     } 
     else 
      printf("recv failed: %d\n", WSAGetLastError()); 
    } 
    //Free the socket pointer 
    free(socket_desc); 

    return 0; 
} 
+0

所以我不需要在这种情况下,线程? – Guy 2014-12-27 22:13:57

+0

这是一个好的开始,而且还有很多余地可以加以改进。 – 2014-12-27 22:14:51

+0

你能举一个我能在这里添加或改进的例子吗? – Guy 2014-12-27 22:16:18

相关问题