TCPServer具有同步全双工通信功能

时间:2013-09-14 05:23:39

标签: c# .net sockets tcp

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

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

2 个答案:

答案 0 :(得分:4)

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

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 而不是阻塞线程。< / p>

答案 1 :(得分:0)

您应该研究使用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上读取,那么你会得到一个read事件。同样,如果fd0上有新连接,那么你也会得到一个读取事件,你可以调用accept。