【发布时间】:2017-01-24 17:59:13
【问题描述】:
我正在对 Raspberry Pi(PC 中的服务器)中的 TCP 客户端应用程序以及使用 LTE 调制解调器的 PPP(点对点协议)进行一些测试。我使用带有套接字的 C 程序,检查系统调用的响应。我想测试插座在覆盖范围不好的区域是如何工作的,所以我做了一些移除天线的测试。
我已按照以下步骤操作:
- 连接到服务器 --> OK
- 开始发送数据(写系统调用)--> OK(我也检查了服务器)
- 我移除了 LTE 调制解调器的天线(没有网络,无法 ping)
- 继续发送数据(write系统调用)--> OK(服务器没有收到任何东西!!!)
- 发送完数据并关闭socket --> 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);
}
非常感谢您的帮助。
【问题讨论】:
-
您使用的是非阻塞套接字吗?您如何编写数据并检查结果?能否请您尝试创建客户端程序的Minimal, Complete, and Verifiable Example 并展示给我们?
-
我使用的是默认模式,我猜是阻塞模式(当我连接到服务器时,它会等待连接完成)。