使用的接口
调用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_RCVTIMEO
和LWIP_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));
网友评论