我像这样存储我的客户..
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向客户端发送消息。
感谢。
答案 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
)。