函数原型:
获取属性: 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;
}