| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> SOCKET编程之一个端口如何建立多个TCP连接?(用fork子进程、select、poll、epoll都是可以的)一个端口最大支持建立多少个tcp连接? -> 正文阅读 |
|
[系统运维]SOCKET编程之一个端口如何建立多个TCP连接?(用fork子进程、select、poll、epoll都是可以的)一个端口最大支持建立多少个tcp连接? |
文章目录
文章1:不太清楚socket一个端口如何建立多个tcp连接,这边转载一篇文章一、背景 记得上学期暑假的时候我基于MFC写了一个简单的聊天程序。那个聊天程序,两部分组成,监听客户端请求线程和客户端请求处理线程。 1.服务器接收到登陆请求,验证登陆信息后,如果通过验证建立新线程与其交互,并通知用户连接到新的端口,并创建好新端口的SOCKET连接。 2.然后将用户类和新端口传给新建立的客户端请求处理线程。 当时,可能是没理解好的原因,误以为,一个端口同一时间只能建立起一个TCP连接。所以写这个聊天程序时才会每一个用户分配一个新的端口。 之前,自己了解HTTP后,接触到web应用开发的时候,就疑惑了,web server接收浏览器的请求,都是从80端口接受请求。当时没仔细去想,就以为web server和我那个聊天程序一样,会去建立新的线程与其进行请求处理。 二、问题 最近,写爬虫的时候用到了Smsniff去抓包。发现,一个http请求中。往往是只与服务器的80端口进行通信。这就与我记忆中的SOCKET冲突了。于是今天写了个小代码测试了一下,一个端口,真的能建立多个连接。 三、代码逻辑流程 1.server ①服务端主线程:负责监听5174端口,如果有请求,accept到系统分配的SOCKET(为unsigned int, recv接受函数就需要这个SOCKET)于是建立一个新线程,将这个SOCKET通过lpParament传递给新线程。 ②服务器信息接受线程:负责从lpParment从拿到SOCKET并,recv客户端发来的信息。 2.client 连接到服务器的5174端口,并发送消息。 四、执行结果 一个端口的确能同时建立多条TCP请求。 综合部分网上看到的资料。我的理解是,一个连接的唯一标识是[server ip, server port, client ip, client port]也就是说。操作系统,接收到一个端口发来的数据时,会在该端口,产生的连接中,查找到符合这个唯一标识的并传递信息到对应缓冲区。 1.一个端口同一时间只能bind给一个SOCKET。就是同一时间一个端口只可能有一个监听线程(监听listen之前要bind)。 2.为什么一个端口能建立多个TCP连接,同一个端口也就是说 server ip和server port 是不变的。那么只要[client ip 和 client port]不相同就可以了。能保证接唯一标识[server ip, server port, client ip, client port]的唯一性。 六、疑问解答 1.如果监听的线程释放掉监听用的SOCKET了,会影响之前通过这个监听SOCKET建立的TCP连接么? 答案:并不会,SOCKET之间是独立的,不会有影响(我已经自己写了程序验证了,读者可以自己写代码验证)。 2.一个端口能建立多个UDP连接么? 答案:UPD本身就是无连接的。所以不存在什么多个UDP连接。只是,服务端接收UDP数据需要bind一个端口。一个SOCKET只能绑定到一个端口。 文章2:一台Linux服务器最多能支撑多少个TCP连接?1、一次关于服务器端并发的聊天
活动连接数量确实达到了100W:
当前机器内存总共是3.9GB,其中内核Slab占用了3.2GB之多。MemFree和Buffers加起来也只剩下100多MB了:
通过slabtop命令可以查看到densty、flip、sock_inode_cache、TCP四个内核对象都分别有100W个: 结论:socket服务端只用开一个端口监听(listen)socket请求就行,理论上来说,最大能支持2的32次方(ip数)×2的16次方(port数)个连接,但是linux对打开文件数有限制(65536个,每个socket连接占用一个文件),如果想支持更多,需要修改系统级/用户级/进程级文章3:为什么服务端需要产生两个socket(listen_socket_fd和connect_socket_fd)
先放着,去看其他的先。。。 20220512 一个端口当然是可以建立多个tcp连接的,以socket服务端为例,bind一个端口后监听,可以用fork子线程的方法去处理socket_fd;如果不想用子线程处理,也可以用select,或者poll或者epoll,都是可以的20220512 像上面说维持了100W条长连接,应该绝对没有fork子进程,否则子进程怎么够呢?估计是单线程,用select或poll、epoll方法,一个连接占用一个文件描述符(上文图中称为“文件句柄”) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 15:43:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |