Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 无源和有源插座_Sockets_Port - Fatal编程技术网

Sockets 无源和有源插座

Sockets 无源和有源插座,sockets,port,Sockets,Port,引述自: 套接字有两种主要的风格。 一个有源插座连接到一个 通过开放式数据端口远程活动套接字 需要。。。无源插座是 未连接,而是等待 在需要的情况下 每年生成一个新的活动套接字 已完成确认 每个端口可以有一个无源端口 插座绑在上面,等待着 施工要求,以及 多个有源插座,每个 应对开放式环境 端口上的连接。好像 工厂工人在等新的工人 预计到达的时间(他表示) 无源插座),以及 他说,消息来自一个新的发送者 响应(a) (必要时)通过 删除其他人(主动 插座)来实时读取数据包 并在必要时回复发件人

引述自:

套接字有两种主要的风格。 一个有源插座连接到一个 通过开放式数据端口远程活动套接字 需要。。。无源插座是 未连接,而是等待 在需要的情况下 每年生成一个新的活动套接字 已完成确认

每个端口可以有一个无源端口 插座绑在上面,等待着 施工要求,以及 多个有源插座,每个 应对开放式环境 端口上的连接。好像 工厂工人在等新的工人 预计到达的时间(他表示) 无源插座),以及 他说,消息来自一个新的发送者 响应(a) (必要时)通过 删除其他人(主动 插座)来实时读取数据包 并在必要时回复发件人 必要的。这就允许工厂 工人可以自由接收新的 小包。

然后,本教程解释说,建立连接后,活动套接字将继续接收数据,直到没有剩余字节,然后关闭连接

我不明白的是:假设有一个到端口的传入连接,发送方希望每20分钟发送一些小数据。如果活动套接字在没有剩余字节时关闭连接,发送方是否必须在每次发送数据时重新连接到端口?我们如何将曾经建立的连接保持更长的时间?你能告诉我我错过了什么吗


我的第二个问题是,谁决定并发工作的活动套接字的限制

发送方应定期发送KEEPALIVE数据包,以保持连接处于活动状态。KEEPALIVE的格式取决于协议。它可以小到TCP数据段中的单个NULL

至于第二个问题。。。这取决于I/O。如果它阻止I/O,那么您只需要在计算机上运行一定数量的线程,因此您将无法拥有许多客户端。如果它是非阻塞的,您可以拥有更多的客户端。编程语言应该同时支持阻塞和非阻塞I/O(我知道Java确实支持)

它还取决于带宽、每个客户机的数据传输、内存、时钟速度等因素。但非阻塞与阻塞可以在您可以接受的客户机数量上产生巨大差异。如果您的服务器没有崩溃,您可能无法阻止超过5-10个客户端。。。但是如果你不阻止的话,你可以有几千个。

第一个问题: 是的,一旦插座关闭,您必须执行“打开”以重新启动通信

第二个问题:
是的。如果您愿意,您可以创建到服务器的64k连接,并遭受端口耗尽(我不建议这样做)。如ktm5124所述,这完全取决于您的应用程序。有几种不同的方法可以使服务器可扩展,包括使用异步I/O和/或线程池来处理客户端请求。

请不要混淆TCP/IP实现通过网络发送的实际数据包以及程序与实现TCP/IP的库之间的交互

套接字只是TCP/IP实现(库或内核操作系统)提供给程序的抽象。您可以将套接字视为与管道的连接(localIP:port-remoteIP:port)。您的程序打开套接字,通过套接字通信数据,如果不再需要帮助释放资源,则可能会关闭套接字。这是正常流量。然而,TCP/IP实现可能出于其自身的正当原因关闭套接字。其中一些原因:网络访问电缆断开、网络路由错误、服务器停机等。因此,即使程序没有关闭tcp/ip套接字,也可能会发现它已关闭

现在,您的第一个问题是,如果我的程序发送的数据段很小,中间有很长的停顿,我该怎么办。答案是:这取决于暂停时间的长短以及在另一边听你讲话的程序。大多数TCP/IP实现都有一个连接超时的概念,为您提供真实不可靠网络上可靠连接的抽象。因此,如果您的程序暂停时间超过tcp/ip超时时间,您将发现您的套接字已被库关闭,您需要重新打开套接字。这也可能导致您重新启动通信,具体取决于tcp/ip连接管道另一端侦听您的程序

有几种方法可以增加tcp/ip超时并使其保持活动状态。这些可以作为网络配置、另一端的服务器软件配置的一部分来完成,或者通过在tcp/ip库调用中设置KEEPALIVE参数来明确要求保持套接字打开。它是否仍然开放取决于。tcp/ip如何保持套接字打开的完整细节不应让您感到困惑,因为它与您的代码无关。TCP/IP有许多设置和不同的超时,为您的程序提供稳定可靠连接的假象。好的方面是,只要你不滥用它,它就可以从你的程序代码中隐藏。将暂停时间保持在几秒钟以下:)一组超时设置可能适用于可靠本地网络中的小型应用程序,但不适用于高负载应用程序或跨大陆连接。每种具体情况都有自己的解决方案,通常不止一种


在这个特定的问题“每20分钟发送一些小数据”中,我建议您关闭和打开每次通信的套接字连接。打开一个的时间少于一秒钟,不应影响您的沟通。作为回报,您可以降低通信协议的复杂性。接收器总是在新的套接字连接上重新启动,当您不需要时,这两个系统可以在整个20分钟内享受tcp/ip通信中的免费资源。

您正在改写这篇文章并获取一些信息