我正在使用 LTE 调制解调器使用 Raspberry Pi(PC 中的服务器)和 PPP(点对点协议(protocol))对 TCP 客户端应用程序进行一些测试。我已经将 C 程序与套接字一起使用,检查系统调用的响应。我想测试 socket 在覆盖范围较差的区域如何工作,所以我做了一些移除天线的测试。
我已执行以下步骤:
- 连接到服务器 --> 确定
- 开始发送数据(写系统调用)--> OK(我也 checkin 了服务器)
- 我把 LTE 调制解调器的天线拆掉了(没有网络,不能 ping)
- 继续发送数据(写入系统调用)--> OK(服务器没有收到任何东西!!!)
- 发送完数据并关闭套接字 --> OK(连接仍然打开,天线被移除后没有数据)
- 程序已完成
- 我又把天线放好
一段时间后,数据上传完毕,连接关闭。但是我按照这个步骤做了另一个测试但是有更多的数据,它没有上传这些数据......
我不知道有没有什么办法可以确保服务器接收到写入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/