1

我很困惑:是否可以/建议组合线程并在 fd 上选择?例如:我想制作一个线程化的 tcp 客户端-服务器程序,客户端可以向服务器发送消息,服务器将其传播给所有连接的客户端(客户端可以继续通信)。

我制作了一个服务器-客户端程序,所有客户端在连接时都有一个单独的线程;但我在beej指南中读到“如果你在accept()调用上阻塞怎么办?你将如何同时接收recv()数据?“使用非阻塞套接字!”没办法!你不想要成为一个 CPU 猪。然后呢?

在这种情况下,我不明白阻塞意味着什么;因为在我的程序中,当我输入文本并按下输入时,文本会发送到服务器,但为什么他的意思是同时接收数据?当我输入文字时?这怎么可能?我想我很困惑 :p 比我认为这些是处理程序的完全不同的方式但是我没有看到选择提供的优势?谢谢

4

2 回答 2

1

当然可以使用多个调用 的线程select,但不是必需的。服务器可以只用一个线程为所有客户端提供服务。如何?一次一个。当事件发生在您提供的集合中的一个套接字上时, 该select函数(及其替代品,例如poll、等)可以通知您。当一个ing 套接字可以时也会通知你。所以服务器可以只有一个事件循环处理监听和连接的套接字。epollselectlistenaccept

至于优点和缺点是什么,我只是给你一个C10K问题文章的链接。这是一个相当古老的辩论。

于 2012-05-24T22:27:34.193 回答
0

在这种情况下,我不明白阻塞意味着什么;因为在我的程序中,当我输入文本并按下输入时,文本会发送到服务器,但为什么他的意思是同时接收数据?

当然可以。例如,您可以select()在选择的 fd 上并在其他线程中处理它们(因此持续时间不会阻止可能发生的其他事件select())。

在这种情况下,我不明白阻塞意味着什么;因为在我的程序中,当我输入文本并按下输入时,文本会发送到服务器,但为什么他的意思是同时接收数据?

他可能的意思是,当您有一个线程用于接受和接收数据时,您要么阻塞(等待)接受或接收。阻塞意味着您正在等待传入连接(accept)或传入发送数据(receive)。如果您使用非阻塞套接字,如果没有事件发生,它将返回 -1EWOULDBLOCKEAGAIN errno

您可以同时等待select()并使用您的监听 fd 和已连接的客户端 fd。然后,您可以同时等待 fd 上的任何事件(新连接、接收到的数据等)

于 2013-08-16T11:17:10.390 回答