第一个tcp echo客户端无法与第二个tcp echo客户端通信(文件描述符错误)

第一个tcp echo客户端无法与第二个tcp echo客户端通信(文件描述符错误),c,sockets,tcp,network-programming,C,Sockets,Tcp,Network Programming,我的应用程序是多用户回声聊天程序。如果客户机发送消息,服务器将发送给所有客户机,包括消息来源的客户机。它是用c语言实现的 服务器为每个新的客户端连接分叉一个进程。 所有子进程都可以访问存储在共享内存中的所有客户端的套接字描述符 当有一个客户端时,消息会正确地回显。加入第二个客户端时 并将消息正确地发送回两个客户端 当第一个客户端发送消息时,它被正确地传输回第一个客户端。但当尝试将该消息发送到第二个客户端时,它失败,错误为文件描述符错误 同样,每个客户端都可以将消息传输到之前连接的客户端和自身,但

我的应用程序是多用户回声聊天程序。如果客户机发送消息,服务器将发送给所有客户机,包括消息来源的客户机。它是用c语言实现的

服务器为每个新的客户端连接分叉一个进程。 所有子进程都可以访问存储在共享内存中的所有客户端的套接字描述符

当有一个客户端时,消息会正确地回显。加入第二个客户端时 并将消息正确地发送回两个客户端

当第一个客户端发送消息时,它被正确地传输回第一个客户端。但当尝试将该消息发送到第二个客户端时,它失败,错误为文件描述符错误

同样,每个客户端都可以将消息传输到之前连接的客户端和自身,但不能传输到以后连接的客户端


如何解决此问题?

访问套接字描述符并不意味着您可以访问套接字。您需要共享套接字本身,而不是它们的描述符

另外,两个进程试图同时在同一TCP连接上发送的结果是未定义的。例如,数据可能是交错的

所以你的设计基本上被打破了


实际上,您可以共享套接字。如何做到这一点取决于平台。您还需要使用某种形式的IPC来仲裁哪个进程可以写入套接字。例如,您可以为每个套接字使用一个信号量。

我共享了accept()的第二个参数get中的sockaddr\u变量。但是我们需要文件描述符来发送()。@Sankaran:中的
sockaddr\u变量是套接字的地址。通过共享,您只需告诉其他进程套接字的地址。这当然不是共享套接字本身。