linux tcp socket编程中(c语言),accept函数返回值为何会相同代码内详
如果没记错,Linux 分配 fd 应该都是从最小未被使用的数字开始分配的。所以 fd 4 关掉之后下一次 accept / open 什么得到的还是 4 。具体算法忘记了。
■网友
【linux tcp socket编程中(c语言),accept函数返回值为何会相同代码内详】 这个很正常,你可以做个测试,A先连接服务器,查看A的fd值,然后断开A,马上让B连接服务器,你会发现这两个套接字是一样的。所以有些服务器为了避免套接字重用的问题,A断开之后会延迟关闭套接字。
■网友
FD会被重用,所以必然不唯一。如果需要唯一,可以采用(源地址,源端口,目标地址,目标端口,协议)这个五元组作为唯一标识。如果一定需要用FD,可以自己用dup2()分配。刚好以前写过类似代码如下:static int tcp_accept_no_fd_reuse(int listen_fd, struct sockaddr* addr, socklen_t* addr_len){#define FD_MAX 0x00100000#define FD_MIN 0x00000400 static atomic_t fd_curr = ATOMIC_INIT(FD_MAX - 1); int sock_fd = accept(listen_fd, addr, addr_len); if (sock_fd == -1) { int ec = errno; if (ec != EAGAIN) { ERR("%s: failed in accept(), ec=%x, %s", __FUNCTION__, ec, strerror(ec)); } return -ec; } else { //Assign fd to a new value to avoid fd reuse. int new_fd = -1; int old = -1; while(1) { new_fd = atomic_read(\u0026amp;fd_curr); old = atomic_cmpxchg(\u0026amp;fd_curr, new_fd, new_fd - 1); if(old != new_fd) { //a race condition, get next one continue; } if(new_fd == FD_MIN) { atomic_set(\u0026amp;fd_curr, FD_MAX); } else if(new_fd \u0026lt; FD_MIN){ //Rare but possible continue; } if(sock_is_established(new_fd)) { continue; } break; } if(dup2(sock_fd, new_fd) \u0026gt; 0) { DEBUG("%s: dup fd %d to %d.", __FUNCTION__, sock_fd, new_fd); close(sock_fd); sock_fd = new_fd; } else { ERR("%s: Try to dup fd %d to %d failed, errno=%d: %s", __FUNCTION__, sock_fd, new_fd, errno, strerror(errno)); } } return sock_fd;}其中FD_MAX必须小于最大fd数量,需要用ulimit改大。
■网友
没有必要去研究文件描述符的值。
推荐阅读
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- linux 应用层可以使用DMA进行数据传输吗
- tcp通讯时,发送30多个1024的包到客户端,中间有包的大小不对,为啥
- TCP校验和失效的概率是多少
- 网络游戏 采用的是tcp协议还是udp协议
- 目前整个嵌入式linux行业的发展前景咋样
- 有逼格高的XX卫士吗?
- 嵌入式linux通过无线网卡ping后怎样进行无线数据传送有基于嵌入式linux应用程序吗谢谢
- 应届生学完python之后,继续学Java还是学linux运维,或者说做python项目
- 翻译一些英语的技术类杂志的时候,文章的结尾有杂志的简写。请问这个简写还翻译吗比如说LinuxFormat 这份杂志的文章结尾是LXF。
