套接字实例可以多次发送和接收吗?

时间:2014-02-02 22:45:35

标签: c# .net sockets

这个问题可能太模糊了,我可能会把它关闭......

我一直在努力弄清楚如何建立TCP / IP连接超过一周,而我仍然完全迷失了它们的确切工作方式。我看到的所有示例都包括发送一条消息,有时还会中继一条消息并随后关闭套接字。这非常好,但对于与另一台计算机的稳定连接不是很有用。

我正在尝试确定如何在c#.NET框架中使用TCP / IP建立长期数据交换通道。是否接受套接字实例,然后为客户端和服务器打开一个无限期读取和无限期写入缓冲区?或者是一个数据包被接收并且一个被返回,套接字被关闭,另一个socket.Listen实例被调用用于下一个数据包交换?

我甚至买了一本书,其中包含的是单包交换的实例。我太习惯于看到“服务器”和“客户端”的“用户界面”概念,其中连接是长期数据交换,我试图弄清楚这是否真的意味着稳定的连接只是一堆快速打开并关闭套接字以便快速交换数据包。

也许有人可以将我引导到一个网络资源,该资源有关于建立与另一台计算机的长期流连接的良好信息,这可能允许多次交换数据包?

我可能只是运气不好的例子 - 但我真的不想因为在不知道我的目标究竟是什么方向的情况下尝试编写一些全新的东西而大汗淋漓。 - 如果我将每个新的传入连接传递给一个单独的线程 - 这将构成客户端和服务器之间无限期打开的通道,以便在其中一个调用“close()之前无限期地进行数据包交换?”

1 个答案:

答案 0 :(得分:2)

为了简化,您所指的示例可能仅限于单个交换。

TCP Socket与程序员的接口非常类似于文件的接口 - 您正在从字节流中读取和写入。实际上,TCP甚至没有向程序员公开“数据包”的概念,并允许底层IP层在其认为合适的情况下拆分和合并TCP数据包。

例如,在下面的代码中,不能保证这两个消息将在同一个数据包中到达,事实上,接收者甚至都不知道可靠的方法,因为从他的角度来看,他只是接收一个字节数:

public void SocketExample(IPEndPoint endPoint) {
    Socket sender = new Socket(AddressFamily.InterNetwork, 
                SocketType.Stream, ProtocolType.Tcp);

    Socket.Connect(endPoint);

    byte[] message1 = Encoding.ASCII.GetBytes("These might be arrive");
    byte[] message2 = Encoding.ASCII.GetBytes(" in the same packet!");

    sender.Send(message1);
    sender.Send(message2);
}

简而言之,是的,通过相同的TCP连接发送尽可能多的消息,并在字节流的读写方面考虑更多,而不是发送和接收单个数据包。

[编辑] 应该注意的是,TCP是一个full-duplex协议,所以它更像是写入一个流,并从另一个完全独立的流中读取,而另一端是从相反的流读取/写入。 [/编辑]

如果您确实需要来回发射离散数据包,请考虑UDP