TCP服务器发送和接收数据多客户端多线程

TCP服务器发送和接收数据多客户端多线程,c,multithreading,sockets,network-programming,C,Multithreading,Sockets,Network Programming,我想设计一个侦听x客户机的TCP服务器。X很小,比如说10左右,它是固定的。客户端可以随时连接。一旦建立了连接(accept()successful),我将为每个客户端生成一个线程并处理它们 在这个handle()函数中,我想向客户端发送命令并相应地接收数据 问题: 从服务器发送命令后,客户机通过连续发送数据进行响应。如何将命令发送回客户端以停止它?与当前代码一样,我正在从客户机接收数据 我不知道在接收过程中如何从服务器线程发送命令,比如在建立连接后是否需要另一个线程(发送cmds) 如何从客户

我想设计一个侦听x客户机的TCP服务器。X很小,比如说10左右,它是固定的。客户端可以随时连接。一旦建立了连接(
accept()
successful),我将为每个客户端生成一个线程并处理它们

在这个
handle()
函数中,我想向客户端发送命令并相应地接收数据

问题: 从服务器发送命令后,客户机通过连续发送数据进行响应。如何将命令发送回客户端以停止它?与当前代码一样,我正在从客户机接收数据

  • 我不知道在接收过程中如何从服务器线程发送命令,比如在建立连接后是否需要另一个线程(发送cmds)
  • 如何从客户端连续接收数据,同时发送命令?根据用户输入向每个客户端发送命令。(假设用户希望client1开始发送数据,那么我必须向client1发送start。用户希望阻止client1发送,所以我需要向client1发送stop,如果用户希望将data3 cmd发送到client4,那么向client4发送命令data3等。在这种情况下,如何识别客户端?基本上形成一个小协议**

  • 下面的代码正在工作,我可以监听套接字,客户端连接并发送数据。我不确定如何将用户输入的命令发送到正确的客户端(比如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谢谢。但我必须以毫秒间隔从每个客户端接收数据。这就是为什么我不愿意使用睡眠方法。是否有可用的伪代码。