sockets - 被动和主动 socket

标签 sockets port

引自 this socket tutorial :

Sockets come in two primary flavors. An active socket is con­nect­ed to a remote active socket via an open data con­nec­tion... A passive socket is not con­nect­ed, but rather awaits an in­com­ing con­nec­tion, which will spawn a new active socket once a con­nec­tion is es­tab­lished ...

Each port can have a single passive socket binded to it, await­ing in­com­ing con­nec­tions, and mul­ti­ple active sockets, each cor­re­spond­ing to an open con­nec­tion on the port. It's as if the factory worker is waiting for new mes­sages to arrive (he rep­re­sents the passive socket), and when one message arrives from a new sender, he ini­ti­ates a cor­re­spon­dence (a con­nec­tion) with them by del­e­gat­ing someone else (an active socket) to ac­tu­al­ly read the packet and respond back to the sender if nec­es­sary. This permits the factory worker to be free to receive new packets. ...



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

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

我的第二个问题是,谁来确定同时工作的事件套接字的限制?

最佳答案

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

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

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

关于sockets - 被动和主动 socket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4696812/

相关文章:

python - 尝试连接到本地主机套接字服务器时,Web 浏览器上出现 "The connection was reset"

c - Linux Socket 坏文件描述符

iphone - 如何通过套接字或框架将音频从 iPhone 的麦克风流式传输到 Mac/PC?

c++ - 客户端通过Http代理服务器连接服务器(Windows c\c++)

windows - 我如何找出哪个进程正在监听 Windows 上的 TCP 或 UDP 端口?

wordpress - Docker:我无法将 80 以外的端口映射到我的 WordPress 容器

c - C 中的同步回调

java - 在java上打开与一台服务器的两个端口连接

java - 我可以在不连接端口的情况下检查IP端口是否打开吗?

ubuntu - 数字海滴上的 Unity 部署