【问题标题】:how to accept multiple clients with a simple winsock tcp server?如何使用简单的 winsock tcp 服务器接受多个客户端?
【发布时间】:2016-01-02 19:21:16
【问题描述】:

我不知道如何使用winsock 为一个简单的tcp 服务器接受多个连接。

我尝试了几种不同的方法,但不知道如何让另一个连接正常工作。对 accept() 的第一次调用似乎是唯一有效的。有人可以提供一个简单的例子来说明如何做到这一点,或者在这里解释一下listen() 和accept() 发生了什么吗?

#include <string>
#include <Winsock2.h>

WSADATA WsaData; 
unsigned char packet_in[64];
unsigned short port = 29992;
unsigned int max_packet_size =  sizeof(packet_in);
sockaddr_in xaddress;
SOCKET sock;
SOCKET sock1 = INVALID_SOCKET;
SOCKET sock2 = INVALID_SOCKET;

int main()
{   

    int r = WSAStartup( MAKEWORD(2,2),  &WsaData );
    xaddress.sin_family = AF_INET; 
    xaddress.sin_port =  htons(port);
    DWORD nonBlocking = 1;
    sockaddr_in from; 
    int fromLength = sizeof( from );  
    int count = 0;

    sock = socket( AF_INET,  SOCK_STREAM,  IPPROTO_TCP );   

    r = bind(sock, (const sockaddr*) &xaddress,  sizeof(sockaddr_in));
        if (r != 0) printf("%d\n", WSAGetLastError());

    r = listen(sock, SOMAXCONN);
    if (r == SOCKET_ERROR)
            printf("%d\n",WSAGetLastError());

    ioctlsocket(sock, FIONBIO, &nonBlocking);

    while(true)
    {

        if(count == 0)
        {
            sock1 = accept(sock, NULL, NULL);

        }
        else if (count == 1)
        {
            sock2 = accept(sock, NULL, NULL);

        }

        if(sock1 != INVALID_SOCKET)
            count = 1;
        if(sock2 != INVALID_SOCKET)
            count = 2;
        printf("%i\n",count);


    }
    return 0;
}

【问题讨论】:

  • 它会进入您的第二个if statement -- if (count == 1) 吗?您应该在调用 WSAGetLastError 后发布输出和错误。
  • 试试:struct sockaddr_storage ss; socklen_t slen = sizeof(ss); SOCKET fd = accept(listener, (struct sockaddr*)&amp;ss, &amp;slen); ioctlsocket(sock, FIONBIO, &amp;nonBlocking);
  • 摆脱非阻塞模式。在接受线程中你没有其他事情要做,或者你不应该做。

标签: c++ sockets winsock2


【解决方案1】:

我不知道如何在 Windows 上进行网络编程,但它基本上看起来像在 Linux 上,所以这是 Linux 的一个小例子。

struct sockaddr_in server_addr
socklen_t len = sizeof(server_addr);
...
while(1)
{
   struct sockaddr_in client_addr;
   int client_fd;
   if((client_fd = accept(server_sock, (struct sockaddr*)& client_addr, &len)) < 0)
   {
      cerr<<"accept() error"<<endl;
      continue;
   }
   ...
}

有完整的波兰语例子,但你应该明白: full example (find //server.c)

Windows 和 Linux 上的网络编程的主要区别在于结构和类,所以它应该会给你一些知识:Beej's guide to network programming

【讨论】:

    【解决方案2】:
    • 我想从这个简单的程序中,你会得到更好的主意:)

      // Multi-Client - Server chat application
      
          #include"header.h"
      
          void isr(int n)
          {
          printf("Client is Disconnected ..\n");
          kill(getpid(),9);
          return;
          }
      
          main()
          {
              int sockfd,nsfd,len,pid,size;
              char buffer[500],buffer1[500];
              struct sockaddr_in server;
          ///////////////////////////////////////////////////////////////////////
              sockfd=socket(AF_INET,SOCK_STREAM,0);
              if(sockfd==0)
              {
              printf("Socket file is not created socket is fail...\n");
              return;
              }
              ////////////////////////////////////////////////////////////////////////
              server.sin_family=AF_INET;
              server.sin_port=htons(9898);
              len = sizeof(server);
            /////////////////////////////////////////////////////////////////////
              bind(sockfd,(struct sockaddr*)&server,len);
              perror("bind");
            /////////////////////////////////////////////////////////////
              listen(sockfd,5);
              perror("listen");
             /////////////////////////////////////////////////////////////////
              bzero(buffer,sizeof(buffer));
              zero(buffer1,sizeof(buffer1));
              //////////////////////////////////////////////////////////////////////
             while(1)
             {
              nsfd=accept(sockfd,(struct sockaddr *)&server,&len);
                  if(nsfd<0)
                  {   
                      perror("accept");
                      return;
                  }
      
                 if(fork()==0)
                  {
                      while(1)
                      {
                          size=recv(nsfd,buffer,sizeof(buffer),0);
      
                          if(size==0)
                          {
                          printf("Server is Disconnected...\n");
                          return;
                          }
      
                      printf("Data:%s\n",buffer);
                      bzero(buffer,sizeof(buffer));
      
                      }
                 }
              else
              {
                  printf("Enter the massage:\n");
                  signal(17,isr);
      
                    while(1)
                    {
                        gets(buffer);
                        send(nsfd,buffer,strlen(buffer)+1,0);
                         bzero(buffer,sizeof(buffer));
                   }
              }            
        }
      }
      

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 2015-02-14
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2012-01-25
      • 2016-10-05
      • 2017-08-04
      • 2015-12-29
      相关资源
      最近更新 更多