c - 网络不好的 C 中的 TCP 套接字

标签 c sockets tcp

我正在使用 LTE 调制解调器使用 Raspberry Pi(PC 中的服务器)和 PPP(点对点协议(protocol))对 TCP 客户端应用程序进行一些测试。我已经将 C 程序与套接字一起使用,检查系统调用的响应。我想测试 socket 在覆盖范围较差的区域如何工作,所以我做了一些移除天线的测试。

我已执行以下步骤:

  1. 连接到服务器 --> 确定
  2. 开始发送数据(写系统调用)--> OK(我也 checkin 了服务器)
  3. 我把 LTE 调制解调器的天线拆掉了(没有网络,不能 ping)
  4. 继续发送数据(写入系统调用)--> OK(服务器没有收到任何东西!!!)
  5. 发送完数据并关闭套接字 --> OK(连接仍然打开,天线被移除后没有数据)
  6. 程序已完成
  7. 我又把天线放好

一段时间后,数据上传完毕,连接关闭。但是我按照这个步骤做了另一个测试但是有更多的数据,它没有上传这些数据......

我不知道有没有什么办法可以确保服务器接收到写入TCP服务器的数据(我认为TCP层确保了这一点..)。我可以使用 ACK 手动完成,但我想这必须是更好的方法。

发送零件代码:

    while(i<100)
    {
        sprintf(buf, "Message %d\n", i);
        Return = write(Sock_Fd, buf, strlen(buf));
        if(Return!=strlen(buf))
        {
            printf("Error sending data to TCP server. \n");
            printf("Error str: %s \n", strerror(errno));
        }
        else
        {
            printf("write successful %d\n", i);
            i++;
        }
        sleep(2);
    }

非常感谢您的帮助。

最佳答案

write()-syscall 返回 true,因为内核缓冲数据并将其放入套接字的输出队列中。当数据被发送从对等方确认时,它会从此队列中删除。当 OutQueue 已满时,write-syscall 将阻塞。

要确定,如果数据还没有被对等方确认,则必须查看输出队列的大小。对于 linux,您可以为此使用 ioctl():

ioctl(fd, SIOCOUTQ, &outqlen);

但是,使用带内方法确定是否已收到数据会更加简洁和便携。

关于c - 网络不好的 C 中的 TCP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824897/

相关文章:

javascript - Node.js 无法处理多个 tcp 消息

Delphi - 使用 Indy 检查客户端状态的简单 TCP 客户端/服务器

c - C-char数组中的单词搜索

c - 如何将数据从UDP Server 发送到NAT 后面的UDP client?

c - 无法释放 C 中的所有内存

c - sockaddr 如何保存 sockaddr_storage 或 sockaddr_in6?

c++ - 使用 IOCP 时从两个线程调用 WSASend() 和 WSARecv() 是否安全?

c# - TCP Socket Server - 一种检测传入数据的方法

sockets - Azure 服务总线、Redis 缓存、队列等中的单个 TCP channel 何时不足

c - 如何将文件中的字符转换为ascii整数转换为数组?