SOCKET选项

1. IP_TRANSPARENT

[1]socket设置该选项后,可以处理发往非本机的数据包。

  [2]使用流程:

    配置防火墙和路由:

1iptables -t mangle -A PREROUTING ! -d 10.0.110.250 -p tcp -j TPROXY --on-port 10000 --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1 2ip rule add fwmark 1 lookup 100 3ip route add local 0.0.0.0/0 dev lo table 100

    代码:

1//创建监听socket 2int option = 1; 3struct sockaddr_in addr; 4 5addr.sin_addr.s_addr = 0; 6addr.sin_port = 10000; 7addr.sin_family = PF_INET; 8bind(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); 9setsockopt(fd, SOL_IP, IP_TRANSPARENT, &option, sizeof(option)); 10setsockopt(fd, IPPROTO_IP, IP_RECVORIGDSTADDR, &option, sizeof(option)); // udp socket需要设置 11 12//tcp获取客户端连接的真实服务器地址 13struct sockaddr_in client_addr, server_addr; 14socklen_t addrlen = sizeof(struct sockaddr_in); 15new_fd = accept(fd, (struct sockaddr *)&client_addr, &addrlen); 16getsockname(fd, (struct sockaddr *)&server_addr, &addrlen); 17 18//udp获取客户端连接的真实服务器地址 19int found; 20char buffer[1024]; 21char cntrlbuf[64]; 22struct iovec iov[1]; 23struct msghdr msg; 24struct cmsghdr *cmsg; 25struct sockaddr_in client_addr, server_addr; 26 27msg.msg_name = &client_addr; 28msg.msg_namelen = sizeof(struct sockaddr_in); 29msg.msg_control = cntrlbuf; 30msg.msg_controllen = sizeof(cntrlbuf); 31iov[0].iov_base = buffer; 32iov[0].iov_len = sizeof(buffer); 33msg.msg_iov = iov; 34msg.msg_iovlen = 1; 35 36ret = recvmsg(fd, &msg, 0); 37if(ret >= 0){ 38 found = 0; 39 for(cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)){ 40 if(cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVORIGDSTADDR){ 41 memcpy(&server_addr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in)); 42 server_addr.sin_family = AF_INET; 43 found = 1; 44 } 45 } 46}

2.SO_REUSEADDR

[1]这个选项表示复用地址,表示多个socket可以绑定到同一个地址。

  [2]TCP协议时,设置该选项后,可以使用相同的地址去连接不同的服务器地址。但是不可以去连接相同的服务器地址,除非本地的当前连接处于TIME_WAIT状态。

  [3]TCP协议时,如果一个地址已经被bind,则另一个socket不可以再次listen。如果一个地址已经被socket执行listen,则另一个socket不可以再次bind。

  [4]UDP协议时,设置该选项后,可以多个socket绑定同一个地址去接收数据,但是只有最后一个socket可以收到数据(需要继续分析代码)。

  需要注意的是socket的地址格式是ip:port,只有ip和port都相等时才存在复用,有一个不等则不存在复用这一说。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid