setsockopt设置网络套接字属性(如接收超时)函数相关参数

函数原型:

                获取属性: int  getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);

                设置属性: int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

                  参数含义:[sockfd]套接字文件描述符;

                                      [level] 属性所属层(由相应宏定义确定)

                                      [optname] 属性名(由相应宏定义确定)

                                      [optval] 所需数据(如设置SOL_SOCKET<套接字层面>上的SO_RCVTIMEO

                                                                                       <接收超时>时,该数据为超时的时间结构体);

                                       [optlen] 参数长度 (对应结构体或数据的大小sizeof(*))

所需头文件:

                 #include <sys/types.h> 
                 #include <sys/socket.h>

[level] 属性所属层(由相应宏定义确定):宏定义列表

Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_IP         0
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:     /* #define SOL_ICMP  1          No-no-no! Due to Linux :-) we cannot use SOL_ICMP=1 */
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_TCP                 6
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_UDP                17
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_IPV6                41
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_ICMPV6         58
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_SCTP            132
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_UDPLITE      136     /* UDP-Lite (RFC 3828) */
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_RAW               255
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_IPX                  256
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_AX25              257
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_ATALK           258
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_NETROM       259
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_ROSE             260
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_DECNET        261
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_X25                 262
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_PACKET        263
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_ATM                264     /* ATM layer (cell level) */
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_AAL                265     /* ATM Adaption Layer (packet level) */
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_IRDA               266
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_NETBEUI       267
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_LLC                 268
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_DCCP             269
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_NETLINK       270
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_TIPC                271
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_RXRPC           272
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_PPPOL2TP    273
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_BLUETOOTH  274
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_PNPIPE           275
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_RDS                276
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_IUCV               277
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_CAIF               278
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_ALG                279
Linux3.10.0-123.el7.x86_64/include/linux/socket.h:            #define SOL_NFC                280
Linux3.10.0-123.el7.x86_64/include/net/af_ieee802154.h:       #define SOL_IEEE802154    0
Linux3.10.0-123.el7.x86_64/include/net/bluetooth/bluetooth.h: #define SOL_HCI             0
Linux3.10.0-123.el7.x86_64/include/net/bluetooth/bluetooth.h: #define SOL_L2CAP       6
Linux3.10.0-123.el7.x86_64/include/net/bluetooth/bluetooth.h: #define SOL_SCO             17
Linux3.10.0-123.el7.x86_64/include/net/bluetooth/bluetooth.h: #define SOL_RFCOMM  18
Linux3.10.0-123.el7.x86_64/include/uapi/asm-generic/socket.h: #define SOL_SOCKET  1
Linux3.10.0-123.el7.x86_64/include/uapi/linux/can/raw.h:      #define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW)
Linux3.10.0-123.el7.x86_64/include/uapi/linux/can.h:          #define SOL_CAN_BASE 100
Linux3.10.0-123.el7.x86_64/include/uapi/linux/irda.h:         #define SOL_IRLMP      266 /* Same as SOL_IRDA for now */
Linux3.10.0-123.el7.x86_64/include/uapi/linux/irda.h:         #define SOL_IRTTP      266 /* Same as SOL_IRDA for now */
Linux3.10.0-123.el7.x86_64/include/uapi/linux/tipc.h:         #define SOL_TIPC    271

[optname] 属性名(由相应宏定义确定)</include/uapi/asm-generic/socket.h>

#ifndef __ASM_GENERIC_SOCKET_H
#define __ASM_GENERIC_SOCKET_H

#include <asm/sockios.h>

/* For setsockopt(2) */
#define SOL_SOCKET      1

#define SO_DEBUG        1
#define SO_REUSEADDR    2
#define SO_TYPE         3
#define SO_ERROR        4
#define SO_DONTROUTE    5
#define SO_BROADCAST    6
#define SO_SNDBUF       7
#define SO_RCVBUF       8
#define SO_SNDBUFFORCE  32
#define SO_RCVBUFFORCE  33
#define SO_KEEPALIVE    9
#define SO_OOBINLINE    10
#define SO_NO_CHECK     11
#define SO_PRIORITY     12
#define SO_LINGER       13
#define SO_BSDCOMPAT    14
#define SO_REUSEPORT    15
#ifndef SO_PASSCRED /* powerpc only differs in these */
#define SO_PASSCRED     16
#define SO_PEERCRED     17
#define SO_RCVLOWAT     18
#define SO_SNDLOWAT     19
#define SO_RCVTIMEO     20       //设置接收超时时间
#define SO_SNDTIMEO     21
#endif

/* Security levels - as per NRL IPv6 - don't actually do anything */
#define SO_SECURITY_AUTHENTICATION              22
#define SO_SECURITY_ENCRYPTION_TRANSPORT        23
#define SO_SECURITY_ENCRYPTION_NETWORK          24

#define SO_BINDTODEVICE 25

/* Socket filtering */
#define SO_ATTACH_FILTER        26
#define SO_DETACH_FILTER        27
#define SO_GET_FILTER           SO_ATTACH_FILTER

#define SO_PEERNAME             28
#define SO_TIMESTAMP            29
#define SCM_TIMESTAMP           SO_TIMESTAMP

#define SO_ACCEPTCONN           30

#define SO_PEERSEC              31
#define SO_PASSSEC              34
#define SO_TIMESTAMPNS          35
#define SCM_TIMESTAMPNS         SO_TIMESTAMPNS

#define SO_MARK                 36

#define SO_TIMESTAMPING         37
#define SCM_TIMESTAMPING        SO_TIMESTAMPING

#define SO_PROTOCOL             38
#define SO_DOMAIN               39

#define SO_RXQ_OVFL             40

#define SO_WIFI_STATUS          41
#define SCM_WIFI_STATUS SO_WIFI_STATUS
#define SO_PEEK_OFF             42

/* Instruct lower device to use last 4-bytes of skb data as FCS */
#define SO_NOFCS                43

#define SO_LOCK_FILTER          44

#define SO_SELECT_ERR_QUEUE     45

#define SO_BUSY_POLL            46

#endif /* __ASM_GENERIC_SOCKET_H */

使用示例(设置socket的接收超时):

/****************************
 * 功能:设置socket的接收超时检测
 * 如果超过(UDP_WAIT_SEC+UDP_WAIT_USEC*0.001)秒则报错返回,不阻塞接收
 ****************************/

#include <stdio.h>
#include <sys/time.h>

#include <sys/types.h>
#include <sys/socket.h>

#define UDP_WAIT_SEC     5        /* 秒 */
#define UDP_WAIT_USEC    0        /* 微秒 */

void set_socket_recv_timer(int socket_fd)
{
    if(socket_fd < 0)
    {
        printf("[Error]socket no existed!\n\r");
        return;
    }

    struct timeval timer;
    timer.tv_sec = UDP_WAIT_SEC;
    timer.tv_usec = UDP_WAIT_USEC;
    
    setsockopt(socket_fd,SOL_SOCKET,SO_RCVTIMEO,&timer,sizeof(timer));
}

int main()
{
    int net_fd = socket(AF_INET,SOCK_DGRAM,0);
    if(net_fd < 0)
    {
        return 0;
    }

    set_socket_recv_timer(net_fd);
    
    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值