gpt4 book ai didi

sockets - 如何在tcp socket api程序中一个接一个地立即连接客户端

转载 作者:可可西里 更新时间:2023-11-01 02:52:30 27 4
gpt4 key购买 nike

server.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<poll.h>
#include<unistd.h>
#include<arpa/inet.h>

int main()
{
struct pollfd fdarray[5];
int sfd,port,nsfd,n,clen,ret,i;
char str[100];
struct sockaddr_in sadd,cadd;
memset(str,0,sizeof(str));
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
printf("sorry unable to open the file");
exit(1);
}
memset(&sadd,0,sizeof(sadd));
sadd.sin_port=htons(9796);
sadd.sin_family=AF_INET;
sadd.sin_addr.s_addr=INADDR_ANY;
if(bind(sfd,(struct sockaddr*) &sadd,sizeof(sadd))<0)
{
printf("earror");
exit(0);
}
listen(sfd,5);
clen=sizeof(cadd);
for(i=0;i<5;i++)
{
nsfd=accept(sfd,(struct sockaddr*)&cadd,&clen);
if(nsfd<0)
{
printf("error accepting client");
exit(1);
}
fdarray[i].fd=nsfd;
fdarray[i].events=POLLIN;
fdarray[i].revents=0;
}
while(1)
{
ret=poll(fdarray,5,-1);
for(i=0;i<5;i++)
{
if(fdarray[i].revents==POLLIN)
{
n=read(fdarray[i].fd,str,100);
if(n<0)
printf("arreo");
printf("message is:%s \n",str);
char *buff="message received";
int j;
for( j=0;j<5;j++)
{
if(j!=i)
n=write(fdarray[j].fd,buff,sizeof(buff));
}
}
}
}
return 0;
}

我为聊天服务器编写了一个程序,例如,如果连接了四个客户端,如果其中一个客户端发送消息,那么所有其他客户端都应该收到消息,除了发送这个过程应该由服务器完成,即客户端应该发送到服务器和服务器现在应该在我的代码中连接到所有其他服务器服务器等待所有五个客户端连接我应该怎么做才能一个接一个地立即连接所有客户端而不是等到所有客户端都连接

    client.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<poll.h>
#include<unistd.h>
int main(int argc,char* argv[])
{
int sfd,i;
char msg[1024];
char blanmsg[1024];
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
sfd=socket(AF_INET,SOCK_STREAM,0);
saddr.sin_family=AF_INET;
inet_pton(AF_INET,"127,0.0.1",&saddr.sin_addr);
saddr.sin_port=htons(9796);
connect(sfd,(struct sockaddr*)&saddr,sizeof(saddr));
for(i=0;i<5;i++)
{
fgets(msg,1024,stdin);
send(sfd,msg,strlen(msg),0);
recv(sfd,blanmsg,sizeof(blanmsg),0);
printf("%s",blanmsg);
fflush(stdout);
}
exit(0);
}

最佳答案

如果我对问题的理解正确:您希望在某些客户端尚未连接时为已连接的客户端提供服务。

您可以通过将客户端 accept()ing 移动到 while(1) 循环中来做到这一点。为此,您必须将服务器套接字添加到 fdarray,并在接受新客户端时将客户端套接字添加到 fdarray

这是一个非常相似的例子:Single thread echo server implemented by using poll()

关于sockets - 如何在tcp socket api程序中一个接一个地立即连接客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096033/

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