linux系统实现多个进程监听同一个端口

通过 fork 创建子进程的方式可以实现,其他情况下不行。
当连接到来时,子进程、父进程都可以 accept, 这就是著名的“惊群”问题(thundering herd problem)。

惊群现象

在该模型下(多个子进程同时共享监听套接字)即可实现服务器并发处理客户端的连接。这里要注意的是,计算机三次握手创建连接是在内核进程里完成的,不需要应用服务进程参数的,而服务进程仅仅要做的是调用accept将已建立的连接构建对应的连接套接字connfd(可参考 http://blog.csdn.net/ordeder/article/details/21551567)。多个服务进程同时阻塞在accept等待监听套接字已建立连接的信息,那么当内核在该监听套接字上建立一个连接,那么将同时唤起这些处于accept阻塞的服务进程,从而导致“惊群现象”的产生,唤起多余的进程将影响服务器的性能(仅有一个服务进程accept成功,其他进程被唤起后没抢到“连接”而再次进入休眠)。

一直疑惑一个应用app如何才能以多进程,多线程的方式运行。对于多线程可能很好理解,我们只要在进程中启用多线程的模式即可。也就是来一个请求,我们就用函数pthread_create()启用一个线程即可。这样我们的应用就可以在单进程,多线程的模式下工作。

但我们知道一个应用app通常工作在多进程,多线程的模式下,它的效率是最高的。那么我们如何才能做到多进程模式呢?经验告诉我们,如果多次启动一个进程会报错:“Address already in use!"。这是由于bind函数导致的,由于该端口号已经被监听了。

其实我们只要在绑定端口号(bind函数)之后,监听端口号之前(listen函数),用fork()函数生成子进程,这样子进程就可以克隆父进程,达到监听同一个端口的目的。

原文地址:https://www.cnblogs.com/shengulong/p/11633481.html

时间: 2024-09-28 09:00:28

linux系统实现多个进程监听同一个端口的相关文章

多个UDP监听同一个端口

测试结果:客户端的数据总是发给最后一个打开的服务器 服务器代码:socket()->setsockopt()->bind()->recvfrom()/sendto() 1 #include <stdio.h> 2 #include <sys/socket.h> 3 #include <sys/types.h> 4 #include <arpa/inet.h> 5 #include <netinet/in.h> 6 #includ

网络:多个进程能否监听同一个端口号?

我们都知道socket是网络上两个进程之间的双向通信链路, 即 socket = <A进程的IP地址:端口号,B进程的IP地址:端口号> 那么有个问题就很有意思了,不同的进程可以监听在同一个IP地址:端口号么? 根据Unix网络编程中的知识可知,服务端监听一个端口会经历: 1.根据套接字类型(Ipv4,Ipv6等)创建套接字socket 2.将套接字bind绑定到具体的网络地址和端口号 3.调用listen开始在这个套接字上进行监听. Unix提供了一个接口setsockopt()可以在bin

[Linux] 多进程网络编程监听一个端口

SO_REUSEPORT支持多个进程或者线程绑定到同一端口 每个进程可以自己创建socket.bind.listen.accept相同的地址和端口,各自是独立平等的.让多进程监听同一个端口,各个进程中accept socket fd不一样,有新连接建立时,内核只会唤醒一个进程来accept,并且保证唤醒的均衡性 <?php $context=stream_context_create(); stream_context_set_option($context, 'socket', 'so_reu

Linux下的启动oracle服务 启动监听 开放端口操作

尝试登录oracle 使用root用户将没有sqlplus命令 [[email protected] ~]# sqlplus /nolog bash: sqlplus: 未找到命令... [[email protected] ~]# su oracle [[email protected] root]$ sqlplus /nolog bash: sqlplus: 未找到命令... 切换为oracle账户尝试登录oracle 此处的/和as之间要有空格 而且只有用oracle账户登录才能生效 否则

Linux系统编程札记:进程通信(一) &nbsp; &nbsp;

进程简单来讲就是一个程序的一次执行,这里说的进程一般都指的是运行在用户态的进程,而处于用户态的不同进程之间是彼此相互隔离的,它们必须通过某种方式来进行通信,具体理由如下: (1)数据传输:有时候一个进程需要将它的数据发送给另一个进程. (2)资源共享:有时候多个进程之间需要共享同样的资源. (3)通知事件:有时候一个进程需要向另一个或一组进程发送消息,通知它们发生了某个事件. (4)进程控制:有些进程希望能够完全控制另一个进程的执行,此时控制进程希望能够拦截另一进程的所有操作,并能够及时知道它的

16.4 配置Tomcat监听80端口;16.5、16.6、16.7配置Tomcat的虚拟主机(上中下);16.8 Tomcat日志

扩展: 邱李的tomcat文档 https://www.linuser.com/forum.php?mod=forumdisplay&fid=37 JAR.WAR包区别 http://blog.csdn.net/lishehe/article/details/41607725 tomcat常见配置汇总 http://blog.sina.com.cn/s/blog_4ab26bdd0100gwpk.html resin安装 http://fangniuwa.blog.51cto.com/10209

Tomcat(介绍,JDK安装,Tomcat安装,配置Tomcat监听80端口)

一.Tomcat介绍 目前有很多网站是用Java编写的,所以解析Java程序就必须有相关的软件来完成,Tomcat就是其中之一 Tomcat是Apache软件基金会,的Jakarta项目中的一个核心项目,由apache.sun和其他一些公司及个人共同开发而成,Tomcat技术先进,性能稳定而且免费,因而深受Java爱好者的喜欢,并得到部分开发商的认可,成为目前比较流行的web因公服务器. Java程序写的网站用Tomcat+jdk来运行的. tomcat是一个中间件,真正起作用的,解析java脚

非root用户无法启动监听80端口的Tomcat

一.问题 网站绑定域名后直接通过域名访问使用的是80端口,因此tomcat须监听80端口.而为了安全起见tomcat一般不用root身份运行,因此需要以普通用户来运行监听80端口的root.此时就会启动失败,报没有权限,因为只有root身份才能监听1024以内的熟知端口. 二.解决 (以下未经验证) There are a few different solutions to work around this: Install and configure Apache or nginx as a

普通用户从非80端口启动tomcat,通过端口转发监听80端口

linux下小于1024的端口都需要root去绑定. root权限启动tomcat是不明智的,可以使用非root权限启动tomcat监听8080端口,然后利用端口转发实现对80端口的监听. 端口转发: # iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 -A PREROUTING 添加新规则-p 检查tcp协议--dport 80 指定目标端口-j REDIRECT 目标跳转--to-prot