TCP服务器可能出现的问题分析
1、前提准备:一台虚拟机作为服务器,多个虚拟机作为客户端。
2、并发连接过程中出现的问题:
- error:connection refused问题:当已经有一部分socket连接上了,但是后续的报此种类型错误(服务器不允许连接),可能是fd的个数不够了,可以通过ulimit -a查看当前fd的上限是多少。
- 解决办法:
- 临时解决:sudo su ,ulimit -n 1048576
- sudo vim /etc/security/limits.conf,编辑limits.conf配置文件,添加如下语句
- * soft nofile 1048576
- * hard nofile 1048576
- 解决办法:

- error:request address问题:客户端报错error:Cannot assign requested address(本机端口号被用完了)。先判断是客户端还是服务端地址无法分配
- socketfd与ip地址之前有什么关系:
- send通过socketfd可以找到一个五元组(远程ip,远程端口,本机ip,本机端口,协议),就知道发到哪个机器,哪个端口
- recv正好相反
- 解决办法:
- 把服务器的远程端口号多开几个,比如原来只开放了8888,现在可以多增加几十个端口
- socketfd与ip地址之前有什么关系:
- error:connection timed out:可能原因
- cat /proc/sys/fs/file-max:可以查看整个系统的fs.file-max,可能是因为fs.file-max的数量不够,如果查出来不是文件系统的问题,还有可能是防火墙的问题
- cat /proc/sys/net/netfilter/nf_conntrack_max :查看内核里面防火墙允许对外连接的个数
- 修改:sudo vim /etc/sysctl.conf 修改nf_conntrack_max数量,然后通过sudo sysctl -p生效
- error:Too many open files in system:
- cat /proc/sys/fs/file-max,发现已经超过了file-max的数量,导致问题出现,所以需要修改
- 解决:sudo vim /etc/sysctl.conf修改file-max的数量
- error:sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max:No such file or dictory
- sudo modprobe ip_conntrack(加载内核模块 ip_conntrack(或新版本中的 nf_conntrack),让 Linux 内核开始启用“连接跟踪(connection tracking)”功能)。然后通过sudo sysctl -p生效
- 内存回收:调整tcp的协议栈
- sudo vim /etc/sysctl.conf
- 252144的单位是页,一页是4K也就是大概1G。只有在2G到3G的时候会进行内存优化,超过3G会强制回收内存
- tcp_wmem:代表发送缓冲区,单位是字节,中间1024代表默认分配缓冲区大小,最大是2048,最小是1024
- tcp_rmem:代表接收缓冲区,单位是字节,中间1024代表默认分配缓冲区大小,最大是2048,最小是1024
- sudo vim /etc/sysctl.conf

本文地址:https://www.yitenyun.com/3722.html
下一篇:C语言函数(三)







