0

我这样存储我的客户..

   int MAXCLIENTS = 4;
   int ClientCount = 0;
   int FreeSpot[MAXCLIENTS];

    typedef struct CLIENTS_FD{

    int sock;
    struct sockaddr_in cli_adr;

    }cliuse;

    cliuse MYCLIENTS[4];

do{

    NewSFD = accept(ServerFD,(struct sockaddr *) &cli_addr, &clilen);
              if (NewSFD < 0)
              {
                 if (errno != EWOULDBLOCK)
                 {
                    perror("  accept() failed");
                    DCSERVER = TRUE;
                 }
                 break;
              }
               if(ClientCount < MAXCLIENTS){
                for(loop = 0; loop < MAXCLIENTS; loop++){

                if(FreeSpot[loop]<0){

                Clients[loop].sock = NewSFD;

                break;

                }

              }

              ClientCount++;
 }
          else
          {

          printf("Maximum Client Reached.\n");
          char *sendtoclient = "Server full";
          send(NewSFD, sendtoclient, strlen(sendtoclient),0);
          close(NewSFD);
          break;

          }

            ip = ntohl(cli_addr.sin_addr.s_addr);
            printf("  Connection from %d.%d.%d.%d\n",
                (int)(ip>>24)&0xff,
                (int)(ip>>16)&0xff,
                (int)(ip>>8)&0xff,
                (int)(ip>>0)&0xff);
                dlogs(ip);


}while(NewSFD != -1);

我知道我可以存储我的客户文件描述符,但是我如何存储我的客户结构并在之后使用它我想向它发送消息?...说我想用 ip 192.168.5.10 向客户端发送消息。

谢谢。

4

1 回答 1

0

我认为您错过了有关网络编程的一些重要观点。也许您应该阅读本文以获取更多详细信息和如何开始的信息。

尽管如此accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen),将填充客户端地址结构,即第二个参数 ( struct sockaddr *addr)。然后,您可以轻松地将此地址添加到您的 CLIENTS_FD 结构中。

Clients[loop].sock = NewSFD; 

Clients[loop].cli_adr = cli_addr;

假设 Clients 是 cliuse (或struct CLIENTS_FD)。

无论如何,就像上面一些评论中提到的那样,您不需要将此地址存储在任何地方。您需要与客户沟通的只是它sockfd(由接受返回)。

更重要的是,您的代码中可能存在一些错误:

int FreeSpot[MAXCLIENTS];

未初始化,因此当您尝试检查它时

if(FreeSpot[loop]<0)

这可能导致错误的行为。您可以简单地编写int FreeSpot[MAXCLIENTS] = {0};You should then 在某处(可能在if(FreeSpot[loop]<0)语句内部)添加类似这样FreeSpot[loop] = 1;的内容以在下次检查之前正确设置它。

int MAXCLIENTS = 4; 

int FreeSpot[MAXCLIENTS];

从 C99 开始,可以使用常量以外的东西来声明表。这称为 VLA(可变长度数组)。尽管如此,在您的情况下,我认为使用 VLA 毫无意义。试试看#define MAXCLIENTS 4(如上面一些评论中所建议的那样)。

要写信给客户,在从 do-while 循环返回后,您可以简单地使用如下所示的内容:

send(Clients[i].sock, msg, len, flags);

其中 i 是您的客户的编号(范围 0-3),再次假设客户是cliuse(或struct CLIENTS_FD)。

于 2012-10-24T07:57:42.677 回答