我正在使用preforking概念。
当我在服务器中建立套接字时,返回的文件描述符值为7.我知道它将为文件描述符分配一个可用的数字。
当我使同一个子进程接受同一套接字上的新连接时,它不会accept()
连接。
但是当我将文件描述符的值重置为7时,它开始接受连接。
我找不到背后的原因。任何人都可以对此有所了解。
我的代码与此类似
for (;;)
{
int session_fd=accept(server_fd,0,0);
if (session_fd==-1)
{
if (errno==EINTR) continue;
die("failed to accept connection (errno=%d)",errno);
}
handle_session(session_fd);
close(session_fd);
server_fd = 7;
}
答案 0 :(得分:3)
当我进行一些读写操作时,文件描述符的值会不断增加。
这没有意义,读取或写入应该在系统返回句柄的同一个套接字上执行。
所以我很想知道socket文件描述符值的重要性。
没有任何意义,它是一个特定于流程的句柄,由一个整数表示,通常每次打开和/或创建一个新的套接字时都会增加1
等。
答案 1 :(得分:0)
我要出去试试看你的代码是like this,绑定server_fd,然后分叉一个孩子来处理每个连接。
如果是这样,值7并不意味着什么。恰好在程序的那个阶段,较低的数字已经在使用中。如果您在调用listen之前打开了其他一些文件或套接字,server_fd
将有不同的编号。
套接字只是它的编号,因此当您reset the value of the file descriptor
时,您正在从原始的绑定套接字读取,而不是accept
调用产生的新套接字。而且我怀疑你不想两次在同一个插座上听,但我从未尝试过。
if (listen(server_fd,SOMAXCONN)) {
die("failed to listen for connections (errno=%d)",errno);
}
for (;;) {
int session_fd=accept(server_fd,0,0);
if (session_fd==-1) {
if (errno==EINTR) continue;
die("failed to accept connection (errno=%d)",errno);
}
pid_t pid=fork();
if (pid==-1) {
die("failed to create child process (errno=%d)",errno);
} else if (pid==0) {
close(server_fd);
handle_session(session_fd);
close(session_fd);
_exit(0);
} else {
close(session_fd);
}
}
答案 2 :(得分:0)
很抱歉打扰你们。我找到了更改session_fd值的问题背后的原因。
session_fd是一个全局变量。由于它是一个巨大的遗留代码,我不知道session_fd的值被其他一些套接字改变了。
感谢所有人提供您的意见:)