Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将select与线程与TCP C程序相结合_C_Multithreading_Select_Tcp_Client Server - Fatal编程技术网

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

将select与线程与TCP C程序相结合,c,multithreading,select,tcp,client-server,C,Multithreading,Select,Tcp,Client Server,我很困惑:是否可以/建议合并线程并选择fd? 例如:我想制作一个线程化的tcp客户端-服务器程序,客户端可以向服务器发送消息,服务器将消息传播到所有连接的客户端(客户端可以继续通信) 我制作了一个服务器客户端程序,所有客户端在连接时都有一个单独的线程;但我在beej指南中读到了“如果您正在阻止一个accept()调用怎么办?如何同时接收()数据?”使用非阻塞套接字!“不行!你不想成为一个CPU猪。那又怎么样?” 我不明白在这种情况下阻塞意味着什么;因为在我的程序中,当我输入文本并按下enter键

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

我制作了一个服务器客户端程序,所有客户端在连接时都有一个单独的线程;但我在beej指南中读到了“如果您正在阻止一个accept()调用怎么办?如何同时接收()数据?”使用非阻塞套接字!“不行!你不想成为一个CPU猪。那又怎么样?”

我不明白在这种情况下阻塞意味着什么;因为在我的程序中,当我输入文本并按下enter键时,文本会被发送到服务器,但为什么他指的是同时接收数据?当我打字的时候?这怎么可能?我想我是糊涂了:p 我认为这是完全不同的解决方案,但我不认为select有什么优势?
Thx

当然可以使用调用
选择的多个线程,但不是必需的。服务器只需一个线程就可以为所有客户端提供服务。怎么用?一次一个。
select
功能(及其替代功能,如
poll
epoll
等)可以在您提供的设备中的一个插座发生事件时通知您<代码>选择
也会在
监听
时通知您,ing套接字可以
接受
。因此,服务器可以只有一个事件循环来处理侦听和连接的套接字


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

当然可以使用多个线程调用
select
,但不是必需的。服务器只需一个线程就可以为所有客户端提供服务。怎么用?一次一个。
select
功能(及其替代功能,如
poll
epoll
等)可以在您提供的设备中的一个插座发生事件时通知您<代码>选择也会在
监听
时通知您,ing套接字可以
接受
。因此,服务器可以只有一个事件循环来处理侦听和连接的套接字

至于优点和缺点是什么,我只给你们一个文章的链接。这是一场老生常谈

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

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

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

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

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

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

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

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

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

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