【发布时间】:2011-08-22 19:38:40
【问题描述】:
我目前正在学习在 Linux 环境中使用 C 进行套接字编程。作为一个项目,我正在尝试编写一个基本的聊天服务器和客户端。
目的是让服务器为每个连接的客户端派生一个进程。
我遇到的问题是读取一个孩子的数据并将其写入所有连接的客户端。
我试图通过在等待数据到达套接字或读取管道末端的子进程中循环调用 select 来实现这一点。如果它到达套接字,则想法是它写入管道的写入端,这导致 select 返回管道的读取端准备好读取。
由于该管道在所有子节点之间共享,因此每个子节点都应读取管道上的数据。这不起作用,因为数据管道似乎不能被每个子进程同时读取,并且在调用读取时“错过”数据块的子进程。
以下是执行此操作的子进程中的代码:
for( ; ; )
{
rset = mset;
if(select(maxfd+1, &rset, NULL, NULL, NULL) > 0)
{
if(FD_ISSET(clientfd, &rset))
{
read(clientfd, buf, sizeof(buf));
write(pipes[1], buf, strlen(buf));
}
if(FD_ISSET(pipes[0], &rset))
{
read(pipes[0], buf, sizeof(buf));
write(clientfd, buf, sizeof(buf));
}
}
}
我假设我目前使用的方法根本行不通。从客户端接收的消息是否可以通过 IPC 写入所有其他连接的客户端?
谢谢
【问题讨论】: