c - 最小化客户端处理 - C 套接字编程

标签 c sockets tcp

我正在开发一个基于 Berkeley 套接字的客户端/服务器模型,并且几乎已经完成,但我一直坚持一种方法来知道所有数据都已收到,同时最大限度地减少在客户端执行的处理。

我正在使用的客户端内存和电池都很少,并且要部署在远程条件下。这意味着我会尽可能避免在客户端进行处理(从而避免电池损耗)。客户端的以下情况不在我的控制范围内:

  • 客户端一次发送 1056 个字节的数据,直到它用完要发送的数据(我不知道数字 1056 来自哪里,但如果你认为你知道我会非常高兴)有兴趣)

  • 客户端何时发送数据是非常不可预测的(它附着在野生动物身上并发送由连接强度和电池生命周期决定的数据)

    <
  • 客户端在任何给定时间都有未知数量的数据要发送

  • 数据通过启用 GRSM 的电话标签传输(不确定这是否相关,但我假设额外的信息只会有帮助)

  • (我正在模拟我期望通过本地主机从客户端接收的数据,如果它看起来有效,我会要求我实习的公司投资一个静态 IP 地址以允许“真正的”tcp 传输,如果不是,我不会。我认为这不相关,但我宁愿提供太多信息,也不愿提供太少信息)

目前,我正在使用 while 循环并增加接收到的字节数,以便“recv()”每个 1056 字节部分。我的问题是服务器需要接收未知数量的这些。对我来说,最明显的解决方案是发送要在来自客户端的初始 header 中接收的部分的数量,或者以某种方式标记正在发送的最后一个部分。但是,这两种方法都需要在客户端进行处理,我想知道是否有一种方法可以检查客户端是否已从服务器端关闭其套接字?或者甚至在没有来自客户端的信息的情况下在预定时间段后关闭与服务器的连接是否可行?如果这些都不可能,那么我很想听听任何其他建议。

TLDR:我可以在此处使用什么条件来最大限度地减少客户端处理

while(!(/* Client has ran out of data to send*/)) {
    receive1056Section();
}

另外,我知道创建一个 stackOverflow 帐户并立即提出问题是不好的做法,我不知道还能做什么,很抱歉。如果我错过了一些非常明显的事情,请不要犹豫,表现得刻薄。

最佳答案

以下是有关如何进行交互的建议:

客户:

客户端通过tcp连接到服务器。

客户端发送数据 block ,直到所有数据都发送完毕。在每个 block 之后刷新发送缓冲区。

完成后,客户端会在套接字上发出关闭 sleep 几秒钟,然后关闭连接。

客户端然后休眠直到下一次传输。如果发送不成功,则 sleep 时间应较短,以防止未发送的数据溢出可用内存。

如果客户端长时间无法连接,您将不得不丢弃内存中无法容纳的数据。

我假设 sleep 可以降低功耗。

服务器:

服务器程序可以是单线程的,除非您需要巨大的可扩展性。它正在监听约定端口上的传入连接。

每当客户端连接时,就会创建一个新的套接字。

使用select()查看哪些套接字有数据(不要忘记包括监听套接字!),并使用非阻塞读取从套接字读取数据。

当您收到适当的错误(没有更多数据可供读取并且另一端已关闭它的连接端)时,您可以关闭该套接字。

这应该可以在数千个同时连接的情况下正常工作。

Example that handles many of the difficulties of implementing a server

关于c - 最小化客户端处理 - C 套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31721435/

相关文章:

java - 简单的 Java 线程 TCP 服务器线程

c - 在没有内存分离的操作系统中退出应用程序

C RSA key 生成器

c - 在进程之间传递值

c++ - 将 IPv4 地址从 ifaddrs 结构分配给 sockaddr_in 结构

java - Swing socket 测试

c - 在 C 中为库设计公共(public)错误代码

无法从另一台计算机访问 Windows 7 上的 Python 套接字

Java TCP 打洞

linux - 添加Iptables规则后无法访问端口号80和443