lwip設(shè)置接收超時的方法

使用的接口

調(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_RCVTIMEOLWIP_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));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容