使用的接口
調(diào)用int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)進(jìn)行設(shè)置。
- s —— 要設(shè)置sock的句柄;
- level —— 要設(shè)置的組,對于sock就是
SOL_SOCKET; - optname —— 要設(shè)置的某個項,在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 —— 設(shè)置的值
- optlen —— 設(shè)置的值的類型的大小,就是
optval的類型的大小。
相關(guān)的編譯選項
涉及到的選項有LWIP_SO_RCVTIMEO和LWIP_SO_SNDRCVTIMEO_NONSTANDARD兩個,需要在lwipopts.h中進(jìn)行配置。
-
#define LWIP_SO_RCVTIMEO 1使能接收超時參數(shù)設(shè)置,如果不使能這個選項是沒辦法配置這個項目的,同理,要配置其它的項目,也要先使能。 -
LWIP_SO_SNDRCVTIMEO_NONSTANDARD決定使用哪種時間參數(shù)格式,源碼是這么說的
/**
* 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
如果使用的格式與設(shè)定的不一致,會返回運(yùn)行錯誤,錯誤類型為EINVAL。因此一定要根據(jù)自己的需要設(shè)置好類型值:
-
#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));