【问题标题】:C# - Multiple TCP connections on one port?C# - 一个端口上有多个 TCP 连接?
【发布时间】:2011-04-26 13:07:09
【问题描述】:

我想知道的是,我可以这样做

client_db.clients[numberOfClients].sock = listener.Accept();

对于我的网络课程,我正在编写一个聊天客户端和它连接的服务器。我有一组客户端对象,其中包含有关连接到服务器的每个人的各种信息。在与一个客户打交道之前,我会让一个套接字等于 listener.Accept,然后我会用那个套接字做我所有的事情。我错误地认为我可以使用一组套接字来与多个客户端建立多个 TCP 连接。

有没有办法做到这一点?我意识到可能有更有效的方法可以做到这一点,但我仍然掌握网络编程的窍门,更重要的是,我的服务器目前基于我使用套接字数组的想法。如果没有办法,这肯定是我会记住的教训。

编辑:我的印象是这不起作用,因为我有一个异常说“不能有多个连接”,尽管我不能再得到那个异常。现在我收到一个对象错误。我很困惑,我需要再调查一下..

【问题讨论】:

  • 请扩展您的第二段,不清楚您遇到了什么数据结构和操作问题。
  • 您是如何得出套接字数组不起作用的结论的?
  • 有很多很棒的网络教程将聊天服务器作为学习线程网络的一种方式。这是一个:switchonthecode.com/tutorials/… 另外,如果你是为你的班级做这个,你不应该自己做一些研究吗? :)
  • 我已经为这门课做了大量的研究,我已经完成了你链接到的那个教程。我开始认为问题出在我的对象数组中,但我仍然不确定。

标签: c# sockets tcp


【解决方案1】:

使用 TCP,你只能让一个进程监听一个端口,但是当它接受连接时(就像你的一样),你会得到一个完全不同的套接字描述符来进行会话,所以你可以回去监听另一个连接的原始套接字描述符。

TCP 的唯一性在于会话级别。换句话说,5 元组(source-ip、source-port、dest-ip、dest-port、protocol)必须是唯一的,这样数据包才不会混淆它们的去向。

您可以让数千个客户端与给定的 dest-ip/dest-port 对通话(例如现在有大量用户点击 stackoverflow.com:80)。

所以是的,你允许做你正在做的事情。

可能发现的是,如果您尝试绑定到该端口,而会话仍处于 TIME_WAIT 状态,您将不被允许绑定。这是为了阻止来自网络上先前会话的任何实时数据包进入并破坏您的会话。

有关 TIME_WAIT 以及为什么需要它的更多信息,请参阅this excellent answer :-)

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 2011-12-08
    • 2013-04-27
    • 2016-10-23
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多