是否有可能accept()(在redhat Enterprise 4 / linux内核2.6上)为来自同一应用程序和同一台机器的同一进程的不同tcp连接返回相同的套接字值?
我很惊讶当我得到这样的结果时,当我检查日志文件时,许多连接在服务器端具有相同的套接字值!怎么可能?!!
顺便说一句,我正在使用TCP阻塞套接字来监听。
main(){
int fd, clientfd, len, clientlen;
sockaddr_in address, clientaddress;
fd = socket(PF_INET, SOCK_STREAM, 0);
....
memset(&address, 0, sizeof address);
address.sin_address = AF_INET;
address.sin_port = htons(port);
....
bind(fd, &address, sizeof address);
listen(fd, 100);
do {
clientfd = accept(fd, &clientaddress, &clientlen);
if (clientfd < 0) {
....
}
printf("clientfd = %d", clientfd);
switch(fork()){
case 0:
//do something else
exit(0);
default:
...
}
} while(1);
}
我的问题是为什么printf("clientfd = %d");
为不同的连接打印相同的号码!!!
答案 0 :(得分:1)
如果服务器在多个进程中运行(例如Apache与mpm worker model),那么每个进程都有自己的文件描述符编号从0开始。
换句话说,很可能不同的进程将获得完全相同的套接字文件描述符编号。但是,fd数字并不是真的意味着什么。它们仍然引用不同的底层对象和不同的本地TCP端口。
答案 1 :(得分:1)
套接字只是一个数字。它是内核数据结构的钩子。
BTW TCP使用IP。查找RFC
答案 2 :(得分:0)
printf()根本不打印任何FD。它缺少一个FD参数。您所看到的可能是返回地址或堆栈中的任何其他任意垃圾。