SOCKET选项
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选项的更多相关文章
- Socket编程基础——Socket选项
有些情况下,我们需要对Socket行为和属性进一步控制,例如修改缓冲区大小,查看Socket状态,这就需要设置/获取Socket选项. 1.获取Socket选项int getsockopt(SOCKE ...
- erlang R17新socket选项{active,N}
erlang R17带来了新的socket选项{active,N} .与{active,once}连同应用层提供的流量控制.为什么会这样选择,{active,once}不能够有效地抑制了很多socke ...
- Linux 高性能服务器编程——socket选项
socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...
- 常用socket选项
1.socket选项通常:服务端应在listen 前设置,accpet返回的socket继承自监听套接字. 客户端应在connect之前设置 2.socket 如果有大量短连接应设置SO_LINGER ...
- Socket编程中的强制关闭与优雅关闭及相关socket选项
以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...
- 浅谈Linux环境下Socket选项的设置
0.前言 TCP/IP协议栈是Linux内核的重要组成部分和网络编程的基石,虽然Linux和BSD有很大的联系,但是对于某些Socket选项和内核操作仍然存在差异,因此文中适用场景均为CentOS环境 ...
- 提高服务端性能的几个socket选项
提高服务端性能的几个socket选项 在之前的一篇文章中,作者在配置了SO_REUSEPORT选项之后,使得应用的性能提高了数十倍.现在介绍socket选项中如下几个可以提升服务端性能的选项: SO_ ...
- socket选项总结(setsocketopt)
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...
- python socket 选项
一.int socket(int domain, int type, int protocol) 1.domain -- 指定使用何种的地址类型 PF_INET, AF_INET: Ipv4网络协议P ...
- socket选项自带的TCP异常断开检测
TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况. 在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应 ...
随机推荐
- [转载]JS中 map, filter, some, every, forEach, for in, for of 用法总结
转载地址:http://codebay.cn/post/2110.html 1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let list = [1, 2, 3, 4, 5] ...
- JdbcTemplate 配置多数据源(完全照抄,完整)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- JPA Example 基本使用使用实例
一.相关接口方法 在继承JpaRepository接口后,自动拥有了按“实例”进行查询的诸多方法.这些方法主要在两个接口中定义,一是QueryByExampleExecutor,一个是JpaR ...
- s21day15 python笔记
s21day15 python笔记 一.内容回顾及补充 回顾 补充 range / xrange(python2与python3的区别六) python2: xrange:不会在内存中立即创建,而是在 ...
- postman Could not get any response。
浏览器输入地址可以返回结果,但是由于返回的json没有格式,看起来比较麻烦,用postman却报错Could not get any response. 可以注意到下面写了可能的情况:比如服务器无响应 ...
- c语言希尔排序,并输出结果(不含插入排序)
#include<stdio.h> void shellsort(int* data,int len) { int d=len; int i; ) { d=(d+)/; //增量序列表达方 ...
- 关于mysql中存储json数据的读取问题
在mysql中存储json数据,字段类型用text,java实体中用String接受. 返回前端时(我这里返回前端的是一个map),为了保证读取出的数据排序错乱问题,定义Map时要用LinkedHas ...
- 软件开发者路线图梗概&书摘chapter4
准确的自我评估:不是超出平庸,而是度量能力,做到更好,谦卑 1.只求最差:学期曲线趋平 更好团队→提供帮助+准确的自我评估 列举团队并排序 2.找人指导:学习前头的人,寻找师傅 加入社区,寻找活跃的老 ...
- Centos搭建NFS服务及客户端访问
一.环境介绍 NFS服务端:192.168.200.101 NFS客户端:192.168.200.102 二.服务器端安装配置 1.查看rpcbind和nfs-utils安装包是否安装 [root@b ...
- log4j根据包名 日志输出到不同文件中 , service层无法输出日志问题
1. service 层因为要配置事务,使用了代理 <aop:config proxy-target-calss=''true"> <aop:pointcut id=&qu ...