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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值