c# - 一个套接字实例可以多次发送和接收吗?

标签 c# .net sockets

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

8年前关闭。




Improve this question




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

一个多星期以来,我一直试图弄清楚如何建立 TCP/IP 连接,但我仍然完全不知道它们是如何工作的。我见过的所有示例都包括发送一条消息,有时还转发一条消息,然后关闭套接字。这非常好,但对于与另一台计算机的稳定连接不是很有用。

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

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

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

我可能只是在示例方面运气不佳 - 但我真的不想在不知道我的目标方向的情况下尝试编写一些全新的东西而大惊小怪 - I.E. - 如果我将每个新的传入连接传递给一个单独的线程 - 在其中一个调用“close()”之前,这是否会在客户端和服务器之间构成一个无限开放的 channel ,用于无限数量的数据包交换?

最佳答案

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

TCP Socket 对程序员的接口(interface)与文件的接口(interface)非常相似——您正在读取和写入字节流。事实上,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协议(protocol),所以它更像是写入一个流,并从另一个完全独立的流中读取,而另一端正在读取/写入相反的流。
[/编辑]

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

关于c# - 一个套接字实例可以多次发送和接收吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21517266/

相关文章:

c - mac os 套接字编程中的 gcc -lnsl 错误

c# - 如何访问主线程

c# - 在 Glide 中播放一次 GIF 图片

c# - 从 C# 访问 Win32/MFC "Stuff"

c# - 为什么要使用事件来实现我可以使用委托(delegate)执行的操作?

队列中的 Java 套接字连接

java - 寻找 “too many files” 原因

c# - 下载时获取文件名

c# - 停止使用 ThreadPool.QueueUserWorkItem 创建的具有特定任务的线程

c# - System.Threading 休眠功能有帮助吗? (C#)