gpt4 book ai didi

c - 两个客户端之间异步传输消息

转载 作者:行者123 更新时间:2023-11-30 18:03:31 25 4
gpt4 key购买 nike

这次我编写了一个聊天服务器和客户端。想法是这样的。

服务器使用 readfd(FD_SET) 的 select 方法来查找连接到其上的哪个客户端有要发送的内容。如果它发现某些内容,则会将其发送给其他客户端。

这是服务器上的选择功能和服务器code的一部分.

SelectResults = select(maxDescriptor+1,&BackUpfdread,NULL,NULL,&time);

我也在客户端中使用选择功能,使其寻找传入和传出消息。(服务器从其他客户端发送的消息以及该客户端想要发送的消息)。

嗯,select函数中的客户端有一个fdread和fdwrite(FD_SET)。

Here是客户端用于连接和聊天的代码部分。

问题是,如果我在服务器上连接两个客户端,消息传输不是并发的,这意味着客户端无法正确聊天。

最后我想到在服务器中使用线程。一个线程用于等待接收,一个线程用于发送给客户,但我想听听您的意见。

最佳答案

在客户端中,您实际上并不需要从 0 到 maxDescriptor 的循环。只需检查 ConnectSocket 是否已设置。像这样的事情:

// Main loop starts here
for(; ;)
{
memset(SentBuff, 0, sizeof(SentBuff));
printf("Write: ");
gets_s(SentBuff, sizeof(SentBuff));

// Copy the fdread into BackUpfdread and fdwrite to BackUpfdwrite.
BackUpfdread = fdread;
BackUpfdwrite = fdwrite;

SelectResults = select(maxDescriptor+1,&BackUpfdread,&BackUpfdwrite,NULL,&timer);

if(SelectResults == -1)
{
perror("Client-select() error!\n");
exit(1);
}

if (FD_ISSET(ConnectSocket, &BackUpfdread))
{
RecvBytes = recv(ConnectSocket, RecvBuff, sizeof(RecvBuff), 0);
if(RecvBytes > 0)
{
printf("%s\n",RecvBuff);
// Cleaning the Receive Buffer
memset(RecvBuff,0,sizeof(RecvBuff));
}
}

if (FD_ISSET(ConnectSocket, &BackUpfdwrite))
{
SentBytes = send(ConnectSocket, SentBuff,sizeof(SentBuff),0);
// Cleaning the Sent Buffer
memset(SentBuff,0,sizeof(SentBuff));
}
} // Main loop ends here

另外,不要忘记检查 sendrecv 中的错误。尤其是 recv 很重要,因为它的调用会告诉您服务器已断开连接。

编辑:另一个需要注意的重要事项是套接字可能始终是可写的,因此在检查套接字是否可写之前添加检查是否有可写的内容。

关于c - 两个客户端之间异步传输消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358546/

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