存储客户端结构并在之后使用它

时间:2012-10-24 02:18:56

标签: c linux sockets

我像这样存储我的客户..

   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向客户端发送消息。

感谢。

1 个答案:

答案 0 :(得分:0)

我想你错过了一些关于网络编程的重要观点。也许您应该阅读this了解更多详情和信息如何开始。

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

Clients[loop].sock = NewSFD; 

Clients[loop].cli_adr = cli_addr;

假设客户是cliuse(或struct CLIENTS_FD)。

无论如何,就像上面的一些评论中提到的那样,你不需要在任何地方存储这个地址。您与客户沟通所需的全部内容是sockfd(由接受退回)。

您的代码中可能存在一些错误:

int FreeSpot[MAXCLIENTS];

未初始化,所以当您尝试检查时

if(FreeSpot[loop]<0)

这可能会导致错误的行为。您可以简单地编写int FreeSpot[MAXCLIENTS] = {0};然后您应该在某处(可能在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)。