在linux上接受时使用相同的SOCKET id

Same SOCKET id when accept on linux?

本文关键字:SOCKET id linux      更新时间:2023-10-16

我写了LD_PRELOAD,它拦截accept()函数。我遇到了一个问题,因为有时accept函数会给我相同的文件描述符。我只为一个进程加载此预加载

我的代码:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
 int fd;
 fd = (*realAccept)(sockfd, addr, addrlen);
 if(fd >= 0)
 {
  printf("file descriptor: %dn", fd);
  ...
  return fd;
 }
}
int close(int fd)
{
 printf("close decriptor: %dn", fd);
 return (*realClose)(fd);
}

输出为:

文件描述符:213

文件描述符:213<--为什么?

关闭描述符:213

为什么accept函数返回相同的文件描述符?

谢谢!

我敢打赌这是由于stdout的缓冲造成的错误。也许还有其他线程在使用它……再加上没有包含结束n,可能会导致输出中出现重复的行。

如果要确定,请在字符串末尾添加n,并在每次调用printf()之后添加fflush(stdout)