1. IP_TRANSPARENT

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

  [2]使用流程:

    配置防火墙和路由:

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

    代码:

//创建监听socket
int option = ;
struct sockaddr_in addr; addr.sin_addr.s_addr = ;
addr.sin_port = ;
addr.sin_family = PF_INET;
bind(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
setsockopt(fd, SOL_IP, IP_TRANSPARENT, &option, sizeof(option));
setsockopt(fd, IPPROTO_IP, IP_RECVORIGDSTADDR, &option, sizeof(option)); // udp socket需要设置 //tcp获取客户端连接的真实服务器地址
struct sockaddr_in client_addr, server_addr;
socklen_t addrlen = sizeof(struct sockaddr_in);
new_fd = accept(fd, (struct sockaddr *)&client_addr, &addrlen);
getsockname(fd, (struct sockaddr *)&server_addr, &addrlen); //udp获取客户端连接的真实服务器地址
int found;
char buffer[];
char cntrlbuf[];
struct iovec iov[];
struct msghdr msg;
struct cmsghdr *cmsg;
struct sockaddr_in client_addr, server_addr; msg.msg_name = &client_addr;
msg.msg_namelen = sizeof(struct sockaddr_in);
msg.msg_control = cntrlbuf;
msg.msg_controllen = sizeof(cntrlbuf);
iov[].iov_base = buffer;
iov[].iov_len = sizeof(buffer);
msg.msg_iov = iov;
msg.msg_iovlen = ; ret = recvmsg(fd, &msg, );
if(ret >= ){
found = ;
for(cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)){
if(cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVORIGDSTADDR){
memcpy(&server_addr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
found = ;
}
}
}

 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都相等时才存在复用,有一个不等则不存在复用这一说。

  

SOCKET选项的更多相关文章

  1. Socket编程基础——Socket选项

    有些情况下,我们需要对Socket行为和属性进一步控制,例如修改缓冲区大小,查看Socket状态,这就需要设置/获取Socket选项. 1.获取Socket选项int getsockopt(SOCKE ...

  2. erlang R17新socket选项{active,N}

    erlang R17带来了新的socket选项{active,N} .与{active,once}连同应用层提供的流量控制.为什么会这样选择,{active,once}不能够有效地抑制了很多socke ...

  3. Linux 高性能服务器编程——socket选项

    socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...

  4. 常用socket选项

    1.socket选项通常:服务端应在listen 前设置,accpet返回的socket继承自监听套接字. 客户端应在connect之前设置 2.socket 如果有大量短连接应设置SO_LINGER ...

  5. Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

  6. 浅谈Linux环境下Socket选项的设置

    0.前言 TCP/IP协议栈是Linux内核的重要组成部分和网络编程的基石,虽然Linux和BSD有很大的联系,但是对于某些Socket选项和内核操作仍然存在差异,因此文中适用场景均为CentOS环境 ...

  7. 提高服务端性能的几个socket选项

    提高服务端性能的几个socket选项 在之前的一篇文章中,作者在配置了SO_REUSEPORT选项之后,使得应用的性能提高了数十倍.现在介绍socket选项中如下几个可以提升服务端性能的选项: SO_ ...

  8. socket选项总结(setsocketopt)

    功能描述:        获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...

  9. python socket 选项

    一.int socket(int domain, int type, int protocol) 1.domain -- 指定使用何种的地址类型 PF_INET, AF_INET: Ipv4网络协议P ...

  10. socket选项自带的TCP异常断开检测

    TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况. 在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应 ...

随机推荐

  1. SpringBoot实现跨域

    一.什么是跨域请求? 跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样.说白了就是ip.网络协议.端口都一样的时候,就是同一个域,否则就是跨域.这是由 ...

  2. UNION ALL 心得

    TABLE_A 表 UNION ALL TABLE_B 表 UNION 或者 UNION ALL 之后 1.字段长度 必须相同  (如A 10 个列,则B 也要10个列) 2.查询条件也要相同  (A ...

  3. Python全站之路----常用模块----configparser模块

    config:配置    parser:解析 此模块用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser,在 python 2.x 里名字为 Co ...

  4. ArcGIS中的坐标系:基本概念和常用操作(二)

    关于坐标系,上次的内容还没有结束. 上次已经解释清楚关于投影坐标系和地理坐标系的区别了,它们在实际应用上也有诸多不同. 下面这张图应该比较清晰 我们经常能发现,当计算面积时,提示面积已禁用,原因就在于 ...

  5. Alisha’s Party (HDU5437)优先队列+模拟

    Alisha 举办聚会,会在一定朋友到达时打开门,并允许相应数量的朋友进入,带的礼物价值大的先进,最后一个人到达之后放外面的所有人进来.用优先队列模拟即可.需要定义朋友结构体,存储每个人的到达顺序以及 ...

  6. github/gitee使用办法2

    打开自己的仓库 git pull 把内容复制过去 git add . 添加所有 查看状态 git status 提交 git commit -m 'XXX' 最后push git push 如果内容本 ...

  7. centos7下安装nginx

    1.yum install epel-release(安装epel(Extra Packages for Enterprise Linux)) 2.yum repolist(确保epel添加到yum的 ...

  8. vue-cli项目在IE下运行钩子函数抛出异常“ReferenceError: “Promise”未定义&quot;”的解决办法

    兼容IE是个坑,低版本IE很多都没法跑起来 问题现象:vue-cli项目在IE下运行,会在钩子函数出现 ReferenceError: “Promise”未定义 解决办法: step1:安装最新的we ...

  9. c++中函数指针作为int传递

    int f() { ; } typedef int (*method)(); int _tmain(int argc, _TCHAR* argv[]) { int value = (int)& ...

  10. maven多模块项目构建

    描述 一个大的企业级项目通常跨越了数十万行代码,牵涉了数十或数百软件人员的努力.如果开发者在同一个项目下开   发,那么项目的管理.构建将会变得很难控制.因此设计人员会将项目划分为多个模块,多个模块独 ...