【问题标题】:TCPServer with simultaneous full duplex communication具有同时全双工通信的 TCPServer
【发布时间】:2013-09-14 05:23:38
【问题描述】:

我正在尝试编写一个 c# 服务器/客户端,它将同时通过 TCP 相互发送字节数组。我正试图围绕如何实现这一点。我看到的所有示例都等待消息,然后发送响应。我需要同时进行沟通。

我是否需要为服务器和客户端的传入和传出创建 2 个单独的 TCP 套接字连接?我可以以“全双工”方式同时通过 1 个连接传递数据吗?任何帮助表示赞赏。

【问题讨论】:

    标签: c# .net sockets tcp


    【解决方案1】:

    我建议您查看异步套接字。原因是它们在接收或发送数据时不会阻塞线程。

    Socket.BeginReceive(buffer, offset, size, endReceiveMethod);
    

    endreceive 方法将在收到字节时调用。 (在另一个线程上) 发送也是如此。

    Socket.BeginSend(buffer, offset, size, endSendMethod);
    

    我记得在早期我担心在同一个线程上读写,创建具有读取超时等的困难结构以及每个客户端都有自己的线程。

    异步套接字不需要这样做。它不为每个客户端使用单个线程。它使用 I/O 完成端口 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx 而不是阻塞线程。

    【讨论】:

      【解决方案2】:

      您应该考虑使用 select() 方法来侦听服务器和客户端文件描述符(或 fd)。 http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.select.aspx

      基本上,如果你有一个 TCP 服务器,比如说 fd0,如果客户端发送一个连接,那么服务器 fd 会为新连接创建一个新的 fd,我们称之为 fd1。现在,您需要用这些来做三件事:(a) 在 fd0 上侦听新的传入连接,(b) 在 fd1 上等待接收数据,以及 (c) 在 fd1 上发送数据。发送数据通常是非阻塞的,所以你不必担心。但是,对于 (a) 和 (b),您可以使用 select.. 如果 fd1 上有要读取的数据,那么您将收到一个读取事件。同样,如果 fd0 上有一个新连接,那么您也会收到一个读取事件,您可以调用 accept。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 2015-07-15
        • 2011-03-23
        • 1970-01-01
        • 2012-03-25
        相关资源
        最近更新 更多