gpt4 book ai didi

c - 线程服务器,在客户端之间发送消息

转载 作者:可可西里 更新时间:2023-11-01 02:34:06 24 4
gpt4 key购买 nike

我正在编写一个 C 网络服务器,它将两个客户端配对在一起并允许它们相互发送消息。

目前,每个客户端在服务器中都有自己的线程,在线程中我有一个循环,基本上是 while((numBytesRead = read(fd, buffer, 1024)) > 0)。这工作正常,我能够接收消息,然后将它们回显给客户端。

我的问题是我不确定通过服务器将消息从一个客户端传输到另一个客户端的最佳方式。

我认为我最大的问题是 read() 阻塞,所以我无法向客户端发送消息,直到客户端向服务器发送一些文本以便读取停止阻塞.

有什么办法解决这个问题吗?我最初的想法是创建一个线程用于从客户端读取,一个线程用于写入客户端,但如果读取在一个线程中阻塞,然后我尝试写入同一个文件描述符,那么这不会导致问题吗?

感谢任何帮助!! :)

最佳答案

read 只阻塞不发送数据的客户端线程;所以理论上你可以使用刚刚发送数据的客户端的线程来write到另一个。

另一种可能是使客户端套接字成为非阻塞的,如果流中没有数据,这会导致读取立即返回(有错误)。然而,这是非常处理器密集型的,因为两个套接字都不断地被探测数据并且(几乎总是)没有返回。

我最后建议看的地方是select函数,它可以用来检查一组文件描述符并阻塞,直到它们中的任何一个在流中有数据;此外,它还可以传递超时(阻塞时间的上限)。算法的粗略草图可能是:

  1. 选择(客户端套接字,100 毫秒)
  2. 对于每个有可用数据的套接字:
    1. 读取数据
    2. 将其存储在其他套接字的输出缓冲区中
  3. 对于每个 socket :
    1. 写入当前输出缓冲区
  4. 重复

关于c - 线程服务器,在客户端之间发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6173364/

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