如何用一个简单的winsocktcp服务器接受多个客户端

how to accept multiple clients with a simple winsock tcp server?

本文关键字:服务器 客户端 winsocktcp 何用一 简单      更新时间:2023-10-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("%dn", WSAGetLastError());
    r = listen(sock, SOMAXCONN);
    if (r == SOCKET_ERROR)
            printf("%dn",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("%in",count);

    }
    return 0;
}

我不知道如何在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;
   }
   ...
}

有一个完整的例子是用波兰语写的,但你应该明白:完整示例(查找//服务器.c)

Windows和Linux上的网络编程的主要区别在于结构和类,因此它应该会给您一些知识:Beej的网络编程指南

  • 我认为从这个简单的程序中,你会得到更好的想法:)

    // 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:%sn",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));
                 }
            }            
      }
    }