gpt4 book ai didi

c - 将数据发送到连接在我的服务器上的多个客户端

转载 作者:行者123 更新时间:2023-11-30 17:57:01 25 4
gpt4 key购买 nike

我有一个客户端可以连接到的服务器应用程序。现在我希望当客户端连接时我可以向所有客户端发送数据。当我连接我的两个客户端时,我设法做到了。我发送的内容被我的两个客户端接收。但我的问题是,当我连接 client1 然后将数据发送到服务器时,client1 可以接收数据,然后我连接 client2 并将数据发送到服务器。现在,当我从服务器向客户端发送数据时,只有客户端 1 可以接收数据,但是当我断开客户端 1 的连接时,客户端 2 可以从服务器接收数据。

我怎样才能让它们同时工作?..另外我怎样才能让我的服务器同时接受来自客户端的消息?..

这是我遇到问题的代码部分。

for(j=0;j<MAX_CLIENTS; j++)
Clients[j].connected_sock = -1;


do
{

fduse = fdin;

printf("Waiting for Connection\n");
err = select(sMax + 1, &fduse, NULL, NULL, NULL);

if (err < 0)
{
perror(" select() failed");
break;
}

DescRead = err;
for (SockStorage=0; SockStorage <= sMax && DescRead > 0; ++SockStorage)
{

if (FD_ISSET(SockStorage, &fduse))
{

DescRead -= 1;


if (SockStorage == socketFd)
{
printf(" Listening socket is readable\n");

do
{

NewSFD = accept(socketFd,(struct sockaddr *) &cli_addr, &clilen);
if (NewSFD < 0)
{
if (errno != EWOULDBLOCK)
{
perror(" accept() failed");
DCSERVER = TRUE;
}
break;
}

if(ClientCount < MAX_CLIENTS){

for(loop = 0; loop <MAX_CLIENTS; loop++){

if(Clients[loop].connected_sock<0){

Clients[loop].connected_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);


FD_SET(NewSFD, &fdin);
if (NewSFD > sMax)
sMax = NewSFD;

} while (NewSFD != -1);


}

else
{

int d;
for(d=0; d<MAX_CLIENTS; d++){

printf("Descriptor ID: %d\n", Clients[d].connected_sock);

}


pfds[0].fd = fd;
pfds[0].events = POLLIN;
pfds[1].fd = SockStorage;
pfds[1].events = POLLIN;
state = FALSE;

do
{
rc = poll(pfds, 2, -1);

if (pfds[0].revents & POLLIN)
{

while ((nbytes = read(fd, buf, sizeof(buf)-1)) > 0)
{

buf[nbytes] = '\0';
printf("%s\n", buf);

}

pfds[0].events = 0;
pfds[1].events = POLLIN | POLLOUT;

}

if (pfds[1].revents & POLLIN)
{
err = recv(SockStorage, strbuf, sizeof(strbuf), 0);
if (err < 0)
{
if (errno != EWOULDBLOCK)
{
perror(" recv() failed");
state = TRUE;

}
break;
}

if (err == 0)
{
printf(" Connection closed\n");
state = TRUE;

break;
}

dSize = err;
printf(" %d bytes received\n", dSize);
}


if (pfds[1].revents & POLLOUT)
{

int s;
for(s=0; s<MAX_CLIENTS; s++){

if(Clients[s].connected_sock>0){

err = send(Clients[s].connected_sock, buf, strlen(buf), 0);

if (err < 0)
{
perror(" send() failed");


state = TRUE;

break;
}

}

}
pfds[0].events = POLLIN;
pfds[1].events = POLLIN;
}


} while (TRUE);

这是我向客户发送数据的方式。

 int s;
for(s=0; s<MAX_CLIENTS; s++){

if(Clients[s].connected_sock>0){

err = send(Clients[s].connected_sock, buf, strlen(buf), 0);

if (err < 0)
{
perror(" send() failed");


state = TRUE;

break;
}

}

}

谢谢

最佳答案

通常有几种可能的解决方案:

  1. 您可以为每个客户端连接使用单独的线程;
  2. 您可以使用选择;
  3. 您可以使用投票;
  4. 可以使用epoll;

在Windows环境中还有一些其他的可能性,例如IOCP。

提到的每个解决方案都有一些优点和缺点(您通常需要区分简单性和性能)。

您可以阅读一些网络编程教程以了解更多详细信息,例如this .

关于c - 将数据发送到连接在我的服务器上的多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com