被动和主动插座

时间:2011-01-14 22:50:23

标签: sockets port

引自this socket tutorial

  

套接字有两种主要风格。   活动套接字连接到a   通过开放数据远程活动套接字   连接...被动插座是   没有连接,而是等待   传入连接,将   一旦产生一个新的活动套接字   建立连接   ...

     

每个端口都可以有一个被动端   等待它的插座   传入的连接,和   多个活动套接字,每个   对应开放   端口连接。就好像   工厂工人正在等待新的   消息到达(他代表   被动套接字),当一个   消息来自新发件人,他   发起通信(a   与他们联系   委派他人(活跃的   socket)实际读取数据包   并回复发件人   必要的。这允许工厂   工人可以自由接收新的   数据包。   ...

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

我不明白的是:假设有一个到端口的传入连接,并且发送者想要每20分钟发送一些小数据。如果活动套接字在没有剩余字节时关闭连接,则每次发送数据时发送方是否必须重新连接到端口?我们如何坚持一次建立的连接更长时间?你能告诉我我在这里缺少什么吗?

我的第二个问题是,谁决定了同时工作的活动套接字的限制?

3 个答案:

答案 0 :(得分:7)

发件人应定期发送KEEPALIVE数据包以保持连接活动。 KEEPALIVE的格式取决于协议。它可能与TCP数据段中的单个NULL一样小。

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

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

答案 1 :(得分:4)

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

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

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

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

在这个具体的问题“每20分钟发送一些小数据”我建议你关闭并打开每个通信的套接字连接。打开一个的时间不到一秒钟,不应影响您的沟通。作为回报,您的通信协议的复杂性会降低。 Receiver总是在新的套接字连接上重新开始,并且当您不需要时,两个系统都可以在20分钟内通过tcp / ip通信享受免费资源。

答案 2 :(得分:0)

第一个问题: 是的,一旦套接字关闭,您必须打开以重新启动通信。

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