TCP套接字中recv上的错误文件描述符

TCP套接字中recv上的错误文件描述符,c,linux,sockets,tcp,parallel-processing,C,Linux,Sockets,Tcp,Parallel Processing,我遇到了麻烦,无法用谷歌搜索出解决方案,所以我希望你能帮助我 有一个客户端-服务器应用程序,类似于文本聊天。 服务器接受客户端的连接,为客户端创建新的套接字,并将套接字描述符发送到它的子进程,该子进程将接收到的消息广播给所有连接的客户端 server.c(错误处理和测试被删除) /* structure with fd, sockaddr_in and sockaddrlen */ Socket_in listener; memset(&listener, 0, sizeof(Socke

我遇到了麻烦,无法用谷歌搜索出解决方案,所以我希望你能帮助我

有一个客户端-服务器应用程序,类似于文本聊天。
服务器接受客户端的连接,为客户端创建新的套接字,并将套接字描述符发送到它的子进程,该子进程将接收到的消息广播给所有连接的客户端

server.c(错误处理和测试被删除)

/* structure with fd, sockaddr_in and sockaddrlen */
Socket_in listener;
memset(&listener, 0, sizeof(Socket_in));

listener.saddr.sin_addr.s_addr = htonl(INADDR_ANY);
listener.saddr.sin_family = AF_INET;
listener.saddr.sin_port = htons(conf.port);
listener.slen = sizeof(listener.saddr);

listener.fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

/* Bind socket to port */
bind(listener.fd, (struct sockaddr*)&listener.saddr, listener.slen);

/* socktrans is UNIX-socket for IPC between main process and child */
int pid = fork_receiver(socktrans);

while(1){
    struct sockaddr_in newcliaddr;
    uint nclilen = sizeof(newcliaddr);
    int newsockfd = accept(listener.fd, (struct sockaddr*)&newcliaddr, &nclilen);

    flags = fcntl(newsockfd, F_GETFL, 0);
    fcntl(newsockfd, F_SETFL, flags | O_NONBLOCK)

   /* Sending connected client socket fd to child process */
    sendto(socktrans.fd, &newsockfd, sizeof(newsockfd), 0, (struct 
}
接下来,接收器获取新套接字的fd并将其保存到一个数组中。 接收器的代码如下所示:

int pid = fork();
if(pid < 0)        // fork() failed
    return -1;
if(pid > 0)         // it's parent process -> return child's pid
    return pid;

/* Now we are in child process */
struct fds_s fds;
fds.fds = NULL;
fds.count = 0;

int n, i;
message msg;
int     newclientfd;

while(1){
    memset(&msg, 0, sizeof(msg));
    n = lc_recv_non_block(socktrans.fd, &newclientfd, sizeof(newclientfd), 0);
    if(n > 0){
        add_client(&fds, newclientfd);

    for(i = 0; i < fds.count; i++){
        int fd = fds.fds[i];
        n = lc_recv_non_block(fd, &msg, sizeof(msg), 0);
        if(n > 0){
            broadcast(&bay, &msg, sizeof(msg));
        }
    }
}

exit(0);
我遗漏了什么以及为什么文件描述符会损坏?

请查看API,尤其是SCM\u权限。基本上,您可以使用SCM_权限消息类型和文件描述符数组构建消息。在封盖下,接收端有效地
dup()
s文件描述符,允许访问这些文件

这是非常特定于Linux的。

请查看API,尤其是SCM\u权限。基本上,您可以使用SCM_权限消息类型和文件描述符数组构建消息。在封盖下,接收端有效地
dup()
s文件描述符,允许访问这些文件


这是非常特定于Linux的。

文件描述符特定于进程。您的FD 123通常与另一个进程的FD 123不同。文件描述符特定于进程。你的FD 123通常与另一个进程的FD 123不一样。这很奇怪,但现在sendmsg与EBADF一起下降。。。为什么会这样?sendto与此socketfd配合得很好…我需要一些特殊的插座吗?现在我使用的是AF_UNIX UDP套接字,这很奇怪,但现在sendmsg与EBADF一起使用。。。为什么会这样?sendto与此socketfd配合得很好…我需要一些特殊的插座吗?现在我正在使用AF_UNIX UDP套接字来实现IPC
n = lc_recv_non_block(fd, &msg, sizeof(msg), 0);