SOCKET选项

时间:2022-07-04 10:25:11

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. 从&period;NET和Java之争谈IT这个行业

    一.有些事情难以回头 开篇我得表名自己的立场:.NET JAVA同时使用者,但更加偏爱.NET.原因很简单 1.NET语言更具开放性,从开源协议和规范可以看出; 2.语言更具优势严谨; 3.开发工具V ...

  2. 从零自学Hadoop&lpar;06&rpar;:集群搭建

    阅读目录 序 集群搭建 监控 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一 ...

  3. es5 and es6

    es5学习地址:http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9 ...

  4. Daily Scrum – 1&sol;7

    Meeting Minutes 搞定了一个bug,单词面板滚动条的bug: 在电脑屏幕上的屏幕适配有了新思路: Progress   part 组员 今日工作 Time (h) 明日计划 Time ( ...

  5. java 远程调试

    在java 命令上加入 -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y suspend=y 配置的端口时候要保证没有被占用

  6. 【转】循环递归遍历XML文档或按某要求遍历XML文档

    <?xml version="1.0" encoding="UTF-8"?> <catalog> <cd> <titl ...

  7. wordpress建站过程3——header&period;php

    header.php中包含了一个页面的页头,也就是其他页面中重复出现的部分,包括用户登陆/登陆后显示的文字,导航条,网页logo,有的还包括轮播图. 下面就简单的贴上一个文件吧. <!DOCTY ...

  8. require&period;js疑惑

    昨天小颖分享了一篇require.js入门 ,今天小颖发现了一个很郁闷的问题,希望大神们帮小颖解释下到底是什么原理才能出现以下的现象,其实小颖昨天也有问过园友里的一位帅锅,只是他解释的小颖没太明白.嘻 ...

  9. Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>中的相关知识,再次表示该书 ...

  10. JAVA&lowbar;SE基础——10&period;变量的作用域

    <pre name="code" class="java"> 上个月实在太忙了,从现在开始又可以静下心来写blog了. 变量的作用域指 可以使用此变 ...