lwip 发送短报文有时候会失败的问题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:21   1715   0

1.现象如下:

使用lwip,客户端连接上服务器时,发送短数据报文的时候,大约10个字节(认证包),发送的返回值是发送OK的,但是在服务器端有的时候却不能收到客户端发送的数据。研究才发现,有的情况,它会认为你这个包太小,不会立即发送出去的。如果我们想要不管发多长的字节,都立即发送。那么我们需要设置一下lwip无延时的标志.

static int nodelay_flag = 1;/*定义无延时flag为1*/
static int socket_fd = -1;

/*创建一个socket*/
socket_fd = socket(AF_INET, SOCK_STREAM, 0);


/*连接服务器*/


/*设置连接参数属性即可*/
setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, (void *)&nodelay_flag , sizeof(nodelay_flag));

2.关于开启tcp中的keepalive机制

一般我们做TCP都会定义应用层的心跳包,这个周期根据具体应用来定。但是如果时间比较长,那么我们就判断不了这个客户端是否与服务器处于正常连接的状态,那么可以启动协议中的keepalive机制,这个机制是传输层实现的,是没有应用层的数据的,这个帧称之为探测帧(probe报文)。开启keepalive的代码如下所示:

static int keepalive_flag = 1;// 开启keepalive属性
static int keepidle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
static int keepinterval = 5;// 探测时发包的时间间隔为5秒
static int keepcount = 3;// 探测尝试的次数.如果第1次探测包就收到响应了,则后几次的不再发
static int socket_fd = -1;


/*创建一个socket*/
socket_fd = socket(AF_INET, SOCK_STREAM, 0);

// 打开keepalive功能,需要在执行connect()之前执行
if(setsockopt(socket_fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive_flag, sizeof(keepalive_flag)) < 0)
{
    printf("set keepalive_flag fail!\r\n");
}


/*连接服务器*/


/*设置属性*/
//设置keepalive各项参数值(需要在connect之后设置)
setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP