【问题标题】:Tcp Listener and Client listening to specfic ipTcp Listener 和 Client 监听特定 ip
【发布时间】:2015-05-05 13:40:35
【问题描述】:

我正在尝试做的是监听一个 5000 的套接字,它与代码完美配合

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

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

所以我的问题是,有没有办法让侦听器侦听任何 ip,直到它最终收到连接,然后一旦建立连接,线程只会侦听该 ip 地址?

谢谢

【问题讨论】:

  • 您必须识别您正在收听的每条“消息”。您是否阅读过有关 TCP/IP 通信和通信协议的任何内容?因为这就是协议存在的原因。当然,您需要自己制作。
  • 这完全没有意义。两个客户端,意味着两个不同的连接。他们不接收彼此的数据。

标签: c# multithreading sockets tcpclient tcplistener


【解决方案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 个侦听套接字,每个正在建立的连接都有一个服务套接字。即每个客户。每个连接都是不同的,正确的套接字将接收属于该连接的数据。一个连接只有2个端点,连接是双向的。

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

【讨论】:

  • 问问题都很好。但是,给予信任真的有太多要求了吗?
猜你喜欢
  • 2016-08-26
  • 2012-03-30
  • 2014-06-10
  • 1970-01-01
  • 2019-02-19
  • 2011-06-15
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多