linux socket的accept失败,errno=24(Too many open files)

linux socket的accept失败,errno=24(Too many open files),第1张

你的程序写的可能不是太好,打开太多文件,超过系统设定了

当然,也有可能你的需求就是要打开很多,那么修改系统限制,如下参数可供参考:

1 编辑/etc/sysctl.conf,增加

net.core.somaxconn=131072fs.file-max=131072

然后 sudo sysctl -p

2 修改/usr/include/linux/limits.h,其中NR_OPEN改成

NR_OPEN = 65536

3 编辑/etc/security/limits.conf,增加

*softnofile 65535*hardnofile 65535

server_addr.sin_family = AF_INET// 指定协议族

server_addr.s_addr=inet_addr("10.1.33.4") // 要转换

server_addr.sin_port = htons(5000) // 要转换字节序

if((sd=socket(AF_INET,SOCK_STREAM,0))<0) // 要多加个括号

sprintf(stderr, "error in socket, error code : %d error string: %s\n", errno, strerror(errno))

查看失败原因,可以通过头文件 include <errno.h>

然后打印errno (全局变量,整型,错误码)

strerror(errno) (全局函数,返回字符串,说明错误原因)

例子在上面

上面代码没问题,用Linux虚拟机和window调试时,不能选用Bridge方式,改用NAT方式即可。

因为系统环境不同,这样慢慢地很容易就找到问题出在哪里,打个比方?触发了里面有什么内容,它发送一条消息少年。这类问题(是打比方,精确到端口,语言不同。打印出来看,一步一步排查就行,不限于这一个问题)

另外的可能就是linux客户端上的代码运行机制问题。

首先要100%确定客户端的消息到了服务器端,代码上的表现可能也不同,有没有表示什么时候发完,这一类;

然后这时从服务器端代码接受消息的入口也就是第一行开始单步调试,是否触发了服务器的监听函数。也就是结束符,服务器可能一直在等单条消息的结束


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/9005851.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存