2010-10-17 52 views
6

我想知道是,我是允许这样做C# - 一个端口上有多个TCP连接?

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

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

有没有办法做到这一点?我意识到可能有更高效的方法来做到这一点,但是我仍然陷入了网络编程的困境,更重要的是,我的服务器目前基于使用套接字阵列的想法。如果没有办法做到这一点,这当然是我记得的一个教训。

编辑:我在印象之下,这并没有工作,因为我得到了一个异常说“不能有多个连接”,但我再也不能得到这个异常。现在我收到一个对象错误。我很困惑,我需要更多的了解这个..

+0

请扩大你的第二段,它什么数据结构和操作您有一个问题不明确。 – Richard 2010-10-17 09:44:19

+1

您是如何得出结论:一系列套接字不起作用? – 2010-10-17 09:47:47

+1

有很多很棒的网络教程,实现聊天服务器作为学习线程化网络的一种方式。这里有一个:http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server另外,如果你正在为你的班级做这个,你不应该对自己做一些研究吗? :) – bzlm 2010-10-17 09:53:50

回答

32

使用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找到:-)