美文网首页
lwip设置接收超时的方法

lwip设置接收超时的方法

作者: tianxiaoMCU | 来源:发表于2019-01-09 10:20 被阅读0次
使用的接口

调用int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)进行设置。

  • s —— 要设置sock的句柄;
  • level —— 要设置的组,对于sock就是SOL_SOCKET
  • optname —— 要设置的某个项,在SDK_Vx.x.x\middleware\third_party\lwip\src\include\lwip\sockets.h下定义
/*
 * Additional options, not kept in so_options.
 */
#define SO_DEBUG        0x0001 /* Unimplemented: turn on debugging info recording */
#define SO_ACCEPTCONN   0x0002 /* socket has had listen() */
#define SO_DONTROUTE    0x0010 /* Unimplemented: just use interface addresses */
#define SO_USELOOPBACK  0x0040 /* Unimplemented: bypass hardware when possible */
#define SO_LINGER       0x0080 /* linger on close if data present */
#define SO_DONTLINGER   ((int)(~SO_LINGER))
#define SO_OOBINLINE    0x0100 /* Unimplemented: leave received OOB data in line */
#define SO_REUSEPORT    0x0200 /* Unimplemented: allow local address & port reuse */
#define SO_SNDBUF       0x1001 /* Unimplemented: send buffer size */
#define SO_RCVBUF       0x1002 /* receive buffer size */
#define SO_SNDLOWAT     0x1003 /* Unimplemented: send low-water mark */
#define SO_RCVLOWAT     0x1004 /* Unimplemented: receive low-water mark */
#define SO_SNDTIMEO     0x1005 /* send timeout */
#define SO_RCVTIMEO     0x1006 /* receive timeout */
#define SO_ERROR        0x1007 /* get error status and clear */
#define SO_TYPE         0x1008 /* get socket type */
#define SO_CONTIMEO     0x1009 /* Unimplemented: connect timeout */
#define SO_NO_CHECK     0x100a /* don't create UDP checksum */
#define SO_BINDTODEVICE 0x100b /* bind to device */
  • optval —— 设置的值
  • optlen —— 设置的值的类型的大小,就是optval的类型的大小。
相关的编译选项

涉及到的选项有LWIP_SO_RCVTIMEOLWIP_SO_SNDRCVTIMEO_NONSTANDARD两个,需要在lwipopts.h中进行配置。

  • #define LWIP_SO_RCVTIMEO 1使能接收超时参数设置,如果不使能这个选项是没办法配置这个项目的,同理,要配置其它的项目,也要先使能。
  • LWIP_SO_SNDRCVTIMEO_NONSTANDARD 决定使用哪种时间参数格式,源码是这么说的
/**
 * LWIP_SO_SNDRCVTIMEO_NONSTANDARD==1: SO_RCVTIMEO/SO_SNDTIMEO take an int
 * (milliseconds, much like winsock does) instead of a struct timeval (default).
 */
#ifndef LWIP_SO_SNDRCVTIMEO_NONSTANDARD
#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
#endif

如果使用的格式与设定的不一致,会返回运行错误,错误类型为EINVAL。因此一定要根据自己的需要设置好类型值:

  • #define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 1,使用int类型的时间值,比如:
int opt = 1000; // 单位ms
lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&opt, sizeof(opt));
  • #define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0 或者不定义,则使用struct timeval类型了:
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;

lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(struct timeval));

相关文章

网友评论

      本文标题:lwip设置接收超时的方法

      本文链接:https://www.haomeiwen.com/subject/mwobrqtx.html