socket 端口复用 linux,socket 端口复用
背景
默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口(例如888),这时候,别的套接字就无法使用这个端口( 888 )
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
int sockfd_one;
int err_log;
sockfd_one = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字one
if(sockfd_one < 0)
{
perror("sockfd_one");
exit(-1);
}
// 设置本地网络信息
struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(8000);// 端口为8000
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// 绑定,端口为8000
err_log = bind(sockfd_one, (struct sockaddr*)&my_addr, sizeof(my_addr));
if(err_log != 0)
{
perror("bind sockfd_one");
close(sockfd_one);
exit(-1);
}
int sockfd_two;
sockfd_two = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字two
if(sockfd_two < 0)
{
perror("sockfd_two");
exit(-1);
}
// 新套接字sockfd_two,继续绑定8000端口,绑定失败
// 因为8000端口已被占用,默认情况下,端口没有释放,无法绑定
err_log = bind(sockfd_two, (struct sockaddr*)&my_addr, sizeof(my_addr));
if(err_log != 0)
{
perror("bind sockfd_two");
close(sockfd_two);
exit(-1);
}
close(sockfd_one);
close(sockfd_two);
return 0;
}
那如何让sockfd_one, sockfd_two 两个套接字都能成功绑定8000端口呢?这时候就需要要到端口复用了。端口复用允许在一个应用程序可以把 n 个套接字绑在一个端口上而不出错。
同时,这 n 个套接字发送信息都正常,没有问题。但是,这些套接字并不是所有都能读取信息,只有最后一个套接字会正常接收数据。
端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放或者程序突然退出而系统没有释放端口。这种情况下如果设定了端口复用,则新启动的服务器进程可以直接绑定端口。如果没有设定端口复用,绑定会失败,提示ADDR已经在使用中。
有关知识
设置端口复用函数要在绑定之前调用,而且只要绑定到同一个端口的所有套接字都得设置复用:
// sockfd_one, sockfd_two都要设置端口复用
// 在sockfd_one绑定bind之前,设置其端口复用
int opt = 1;
setsockopt( sockfd_one, SOL_SOCKET,SO_REUSEADDR, (const void *)&opt, sizeof(opt) );
err_log = bind(sockfd_one, (struct sockaddr*)&my_addr, sizeof(my_addr));
// 在sockfd_two绑定bind之前,设置其端口复用
opt = 1;
setsockopt( sockfd_two, SOL_SOCKET,SO_REUSEADDR,(const void *)&opt, sizeof(opt) );
err_log = bind(sockfd_two, (struct sockaddr*)&my_addr, sizeof(my_addr));
socket 端口复用 linux,socket 端口复用相关推荐
- linux7.5开放端口,Centos/linux开放端口
在linux上部署tomcat发现外部无法访问可以通过两种方式解决: 1.关闭防火墙 service iptables stop(不推荐) 2.修改相关文件,开放需要开放的端口 (1)通过命令vi / ...
- linux开启端口,linux配置端口,Linux关闭端口
linux开启端口,linux配置端口,Linux关闭端口 开启端口 1.直接用命令开启端口开放端口命令----保存-----重启服务-------查看端口是否开放/sbin/iptables -I ...
- api有哪些 javasocket_简单hello/hi程序、分析及Java Socket API与Linux Socket API对比
1.Socket 定义 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应 ...
- linux shell 端口占用,linux 查看端口占用命令实例详解
linux 查看端口占用命令实例详解 端口是系统非常重要的一个东东,我们经常需要查看哪个进程占用了哪个端口,或者哪个端口被哪个进程占用.废话不多说,直接上干货,教大家怎样查看系统端口占用情况. 方法一 ...
- linux查看端口物理状态,Linux查看端口使用状态及启动
LINUX网络性能之管理工具三剑客 本文是介绍管理Linux查看端口这些输出信息,该命令将显示从每个数据包传出的头和来自主机hostname对端口80的编址. Netstat -tln 命令是Linu ...
- linux查看server端口占用,Linux查看端口占用的命令
Linux查看端口占用的命令 apt-get install lsof lsof -i:端口号 lsof常用命令 lsof -i:8080:查看8080端口占用 lsof abc.txt:显示开启文件 ...
- Linux服务器禁用端口,Suse Linux常用端口开启、关闭、禁用
Suse Linux常用端口开启.关闭.禁用 下面貌似没有什么直接开启或者关闭端口的命令,因为若仅仅只是开启了端口而不把它与进程相联系的话,端口的开启与关闭就显得毫无意义了(开了端口却没有程序处理进来 ...
- linux io端口复用,Linux系统IO复用接口(select、poll、epoll)
epoll仅仅是一个异步事件的通知机制,其本身并不作任何的IO读写操作,它只负责告诉你是不是可以读或可以写了,而具体的读写操作,还要应用程序自己来完成.epoll仅提供这种机制是非常好的,它保持了事件 ...
- linux 本地端口关,Linux查看端口使用状态、关闭端口方法
首先你必须知道,端口不是独立存在的,它是依附于进程的.某个进程开启,那么它对应的端口就开启了,进程关闭,则该端口也就关闭了.下次若某个进程再次开启,则相应的端口也再次开启.而不要纯粹的理解为关闭掉某个 ...
最新文章
- 产品设计体会(1011)少做就是多做
- Servlet的PrintWriter out = response.getWriter()使用
- Java最大的优势真的在于跨平台吗?
- AV1挑起的Codec之战
- TensorFlow的基本介绍及Hello,world
- 视频 | MIT计算机科学速成课
- 理论 | 当 Spring Boot 遇上了消息队列......
- php 声音文件链 处理,PHP 三种方式实现链式操作
- 如何优雅地编码文本中的位置信息?三种positioanl encoding方法简述
- 微信聊天记录导出文本
- 采用java编写一个软件,100以内的口算题【软件构造大作业】
- Java的Abstraction抽象类/方法-笔记
- android 日历动画的实现
- win0如何添加计算机用户,Win10系统如何添加来宾账户 win10添加来宾账户的方法
- 怎么上传云班课的计算机作业,云班课怎么交作业_云班课作业提交教程_3DM手游...
- 华为手机如何与台式计算机连接不上,华为手机连接不上电脑怎么处理
- SAP R3 系统技术基础
- 米签---个人中心页面功能(uniapp)
- Compound原理
- 中国香港地铁站经纬度(百度坐标系)
热门文章
- android 使用mediaplayer播放报java.io.IOException: setDataSourceFD failed.: status=0x80000000的问题
- 机器学习算法分类-总览
- 首届中小企业国际合作论坛——日本价值工程协会
- 7-7 包装机 (25 分)
- 学习英语01——听力——剑雅12 T7S3
- Java一周签到一次_java做的一个简易的微信签到系统
- TP5 框架 实现无限级分类
- Bonjour_mDNS_笔记
- 混沌数学之Baker模型
- 【炸雷】Elasticsearch 的 Log4j 漏洞处置策略