将 select 与线程与 TCP C 程序结合

问题描述 投票:0回答:2

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

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

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

c multithreading tcp client-server posix-select
2个回答
2
投票

当然可以使用调用

select
的多个线程,但不是必需的。一台服务器只需一个线程即可为所有客户端提供服务。如何?一次一个。当您提供的一组套接字上发生事件时,
select
函数(及其替代品,例如
poll
epoll
等)可以通知您。当
select
插座可以
listen
时,
accept
也会通知您。因此,服务器可以只有一个事件循环来处理侦听和连接的套接字。

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


0
投票

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

当然可以。例如您可以

select()
选定的 fd 并在其他线程中处理它们(因此,此过程的持续时间不会阻止
select()
可能发生的其他事件)。

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

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

EWOULDBLOCK
EAGAIN errno

您可以同时等待

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

© www.soinside.com 2019 - 2024. All rights reserved.