Tcp Listener和客户端监听specfic ip

时间:2015-05-05 13:40:36

标签: c# multithreading sockets tcpclient tcplistener

我想要做的是听一个5000的套接字,它与代码完美配合

TcpListener listener = new TcpListener(IPAddress.Any, 5000);
NetworkStream Network;
TcpClient client;
client = listener.AcceptTcpClient();

但是当服务器有两个连接到服务器的客户端时,它们都会听到相同的消息,因为它们是多线程的,我不希望这发生,因为他们互相读取它们正在从网络流中删除字节

所以我的问题是,是否有一种方法让监听器监听任何IP,直到它最终收到连接,然后一旦建立连接,线程只监听该IP地址?

谢谢

1 个答案:

答案 0 :(得分:1)

TCP无法正常工作。 创建TCP套接字时,绑定到端口A,并听取您拥有的内容:

  • 端口A上的侦听套接字

客户端连接到服务器,会发生的事情是克隆侦听套接字,克隆是套接字对的一部分,另一个套接字是连接套接字。克隆'克隆'套接字称为服务套接字。最终结果:

  • 端口A上的侦听套接字(仍然存在,您没有关闭它)
  • 端口A上的服务套接字,但是套接字对的一部分。 (IPA(A),IPB(B))

套接字对识别连接!当在TCP级别接收到某些内容时,还会检查源IP地址和端口,因此将识别正确的服务套接字,以便在接收时进行。 您永远不会在侦听套接字上收到数据。

如果另一个客户端连接你得到这个,假设一个不同的IP地址和端口:

  • 端口A上的侦听套接字(仍然存在,您没有关闭它)
  • 端口A上的服务套接字,但是套接字对的一部分。 (IPA(A),IPB(B))
  • 端口A上的服务套接字,但是套接字对的一部分。 (IPA(A),IPC(C))

这假设没有关闭连接。您现在看到服务器系统上有3个插槽,所有插槽都使用相同的端口。 1个监听套接字,以及正在建立的每个连接的服务套接字。即每个客户。每个连接都是不同的,右侧套接字将接收属于该连接的数据。连接中只有两个端点,连接是双向的。

TCP有点复杂,您可能会发现我的解释令人生畏,在这种情况下,您应该尝试在书籍或互联网上阅读有关TCP的更多信息。套接字编程也是一个有趣的读取,因为仅仅解释TCP并不能解释套接字级别会发生什么。