TCP服务器发送和接收数据多客户端多线程
我想设计一个侦听x客户机的TCP服务器。X很小,比如说10左右,它是固定的。客户端可以随时连接。一旦建立了连接(TCP服务器发送和接收数据多客户端多线程,c,multithreading,sockets,network-programming,C,Multithreading,Sockets,Network Programming,我想设计一个侦听x客户机的TCP服务器。X很小,比如说10左右,它是固定的。客户端可以随时连接。一旦建立了连接(accept()successful),我将为每个客户端生成一个线程并处理它们 在这个handle()函数中,我想向客户端发送命令并相应地接收数据 问题: 从服务器发送命令后,客户机通过连续发送数据进行响应。如何将命令发送回客户端以停止它?与当前代码一样,我正在从客户机接收数据 我不知道在接收过程中如何从服务器线程发送命令,比如在建立连接后是否需要另一个线程(发送cmds) 如何从客户
accept()
successful),我将为每个客户端生成一个线程并处理它们
在这个handle()
函数中,我想向客户端发送命令并相应地接收数据
问题:
从服务器发送命令后,客户机通过连续发送数据进行响应。如何将命令发送回客户端以停止它?与当前代码一样,我正在从客户机接收数据
下面的代码正在工作,我可以监听套接字,客户端连接并发送数据。我不确定如何将用户输入的命令发送到正确的客户端(比如client4)并同时接收。呜呜呼!我的朋友,你已经决定深入研究一个漂亮的毛茸茸的主题 首先让我重新表述一下您的问题:您的程序一次只能等待一件事。如果它正在等待
接收
,它就不能等待发送
。因此,您不能同时发送和接收
这可以通过多路复用来解决:等待多件事情
io
,多路复用
,选择
,轮询
另一种方法是进入一个
非阻塞读->非阻塞写->睡眠循环。这显然不是最理想的,但对于您的情况来说可能已经足够了。如果您想真正连续地流式传输数据,并且并行地想要交换命令,您将无法绕过与est的附加连接a打开命令通道。备选方案是某种多路复用。流式传输数据块,检查命令,流式传输下一个数据块,再次检查命令…-复杂且容易出错,因为流被不断中断
古老的ftp协议也有类似的功能:和(参见第2.3章中的ascii艺术)过去,我为无法同时通信的低级设备设计了自己的双向协议。可以使用的一种方法是相互让步:建立一种机制,在客户端和服务器之间传递消息。对需要发送的任何命令或消息进行流式传输,然后将流式传输给另一个side.另一方将流式传输任何消息或命令,然后将流式传输给原始方。此机制唯一的问题是,对于高ping连接(如国际互联网连接),它非常滞后
这一点已经提到过了,但我不妨重复一下。计算机的网络硬件中已经内置了多路复用,所以你可以进行“并发”send/recv调用。只需为每个连接运行一对线程:一个recv线程和一个send线程。这应该是最健壮的解决方案。假设您希望让另一个线程发起发送命令的请求,您可以使用标准异步i/o,添加另一个通道(一个管道)来接收命令,来完成您想要的任务来自另一个线程的。伪代码:
Master thread:
while(1) {
newsocket = accept(listen socket)
pipefds = pipe()
new thread(Receiver, newsocket, pipefds.read)
}
Receiver thread:
while(1) {
readfds = [ pipefds.read, newsocket ]
poll( readfds ) // wait for there to be data on one of the fds
if (data ready on newsocket) {
read (newsocket)
process data
}
if (data ready on pipefds.read) {
read (pipefds.read)
send command
}
}
Commander thread:
write (pipefds.write, command)
只要套接字上有数据要读取,或者如果另一个线程发送了需要发送到远程连接的命令,则主接收器循环中的选择将唤醒
要查找信息的关键系统调用是poll
(或select
),和pipe
您能更深入地了解您试图创建的应用程序吗?从您的帖子中可以看出,您试图实现的目标并不明显。@pradheep,我想根据我的命令将数据从我的一些设备传输到服务器。由于我的设备不断生成数据,我需要用STA与他们交流RT发送,结束,获取此数据,有时我还需要连续数周获取数据,有时需要5分钟,等等。谢谢。但FTP在开始向服务器发送数据时不会等待任何命令。抱歉,我没有阅读它。它是一个相当大的文档。可以。谢谢。我指的相似之处在于,FTP除了一个频道之外,还设置了一个单独的conteol频道一个或多个数据流。@M4N07谢谢。但我必须以毫秒间隔从每个客户端接收数据。这就是为什么我不愿意使用睡眠方法。是否有可用的伪代码。