网络编程-06套接字属性+超时检测

一、套接字属性设置

#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[])
{ 
    //1、创建套接字 -- socket()
     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);
    }
//---------------------断开后打开时,错误提示在bind处,即可知设置套接字属性应该在bind前------------
 
 //2、绑定本机IP地址和端口号
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;  //选择ipv4协议
    saddr.sin_port = htons(6666);
    saddr.sin_addr.s_addr = inet_addr("192.168.16.163");  //将点分十进制转换为整形之后再赋值
    //saddr.sin_addr.s_addr = INADDR_ANY;
    
     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");
    
    //3、设置监听套接字 -- listen()
    ret = listen(sockfd, 7);
    if(ret < 0)
    {
        perror("listen");
        exit(-1);
    }
    printf("listen successful!\n");
    
    
    
    //4、等待客户端连接

    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多路复用实现超时检测

//select
struct timeval t;
t.tv_sec=10;
t.tv_usec=0;
select(maxfd,&rfds,&wfds,&errfds,&t);

//poll
struct poll_fd buf[100];
poll(buf,nfds,100000);

//epoll
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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值