一、套接字属性设置
#include <sys/types.h>
#include <sys/socket.h>
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);
返回值:
成功返回0,失败返回-1;
参数:
sockfd:套接字
level:
SOL_SOCKET:通用套接字层
IPPROTO_IP:IP层
IPPRO_TCP:TCP层
optname:选择功能对应宏
optval:设置或者获取属性对应值的地址
optlen:optval数值对应的大小
level属性表:
设置属性表:level
SOL_SOCKET
---------------------------------------------------
参数optname 宏的作用 对应参数optval的类型
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 循序调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获的套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关闭连接 struct linger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDWAIT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSEADDR 允许重用本机地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
===================================================
IPPROTO_IP
------------------------------------------------------
IP_ADD_MEMBERSHIP 加入到组播组中 struct ip_mreq
IP_MULTICAST_IF 允许开启组播报文的接口 struct ip_mreq
eg:服务器先断开会进入WAIT_TIME,取消这个时间
int main(int argc, char *argv[])
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket");
exit(-1);
}
printf("socket successful!\n");
int opt = 1;
int len = sizeof(opt);
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, len) < 0)
{
perror("setsockopt");
exit(-1);
}
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6666);
saddr.sin_addr.s_addr = inet_addr("192.168.16.163");
int s_len = sizeof(saddr);
int ret = bind(sockfd, (struct sockaddr *)&saddr, s_len);
if(ret < 0)
{
perror("bind");
exit(-1);
}
printf("bind successful!\n");
ret = listen(sockfd, 7);
if(ret < 0)
{
perror("listen");
exit(-1);
}
printf("listen successful!\n");
struct sockaddr_in caddr;
memset(&caddr, 0, sizeof(caddr));
int c_len = sizeof(caddr);
struct timeval t;
while(1)
二、超时检测
1.可以通过alarm设置定时,通过signal函数捕获信号SIGALRM来超时检测
alarm(10);
signal(SIGALRM,signal_handler);
void signal_handler()
{
}
2.io多路复用实现超时检测
struct timeval t;
t.tv_sec=10;
t.tv_usec=0;
select(maxfd,&rfds,&wfds,&errfds,&t);
struct poll_fd buf[100];
poll(buf,nfds,100000);
struct epoll_event buf[100];
epoll_wait(epfd,buf,maxevent,10000);
3.通过设置套接字属性完成超时检测
struct timeval t;
t.tv_sec=10;
t.tv_usec=0;
setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&t,sizeof(t));