繁体   English   中英

在套接字上发送时出错错误的文件描述符

[英]error bad file descriptor while send on socket

我试图将数据从服务器子进程发送到客户端。 我将第一个客户端fd存储在ids [0]中,将第二个fd存储在ids [1]中,然后我尝试将数据从第一个子进程发送到另一个客户端,反之亦然。

我得到了错误的文件描述符错误。

//ids are defined at the begining as follows
    int *ids = (int *) mmap(NULL,5*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
//accept is in a for loop...
    mysocket = accept(sock, NULL, NULL);
    printf("\nClient connected ...\n ");
    ids[i]=mysocket;
    i++;
    printf(" socket and id %d %d",mysocket,ids[i-1]);
    int pid = fork();
    if (pid == 0) {
        if (mysocket < 0) {
            perror("Error in accept");
            exit(1);
        }

    do {

        fflush(stdout);
        //clearing the bufffer
        //memset(&buf[0], 0, sizeof(buf));
        //memset(buf, sizeof(buf), '\0');
        //reading message on the socket.
        if(i==1)
        if(send(ids[1], buf, 1024,0)==-1){
            perror("error in i=1");
                    printf("%d %d %d",mysocket,ids[0],ids[1]);
        }

        if(i==2) {
            if(send(ids[0], buf, 1024,0)==-1) {
                perror("error in i=2");
                printf("%d %d %d", mysocket, ids[0], ids[1]);
            }
        }

        if (strcmp(buf, "CLOSE") == 0) {
            close(mysocket);
            break;
        }

    } while (1);

我得到的错误:我= 1中的错误:错误的文件描述符4 4 5

值4和5是fds的值,并且已正确存储,并且我没有在任何地方关闭套接字。

您的代码格式错误,希望我能正确解释。

ids[i]=mysocket;
i++;

如果i0ids[0]现在有效, ids[1]仍然无效(即具有一些看似有效的任意值,但无效),而i现在为1 i==1的情况下,孩子会遇到以下代码(正确格式化后):

    if(i==1)
        if(send(ids[1], buf, 1024,0)==-1){
            perror("error in i=1");
            printf("%d %d %d",mysocket,ids[0],ids[1]);
       }

如您所见,它使用send(ids[1]...但是如上i==1只有ids[0]具有有效值,而ids[1]值无效,因此send失败带有Bad file descriptor

我的猜测是,您假定在主进程中创建的文件描述符实际上在所有子进程中均有效,因为您试图在子进程和主进程之间使用共享数组(使用MAP_SHARED ):

int *ids = (int *) mmap(NULL,5*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

但是这个假设是错误的。 文件描述符不会传播到所有子进程中,而只会在派生到新的子进程时传播。 这意味着您的第一个孩子将仅在fds[0]具有有效的文件描述符,而第二个孩子将在fds[0]fds[1]中均具有有效的文件描述符。 由于共享数组,第一个孩子将在fds[1]中看到与第二个孩子相同的文件号,但这并不意味着该文件号也与有效(内核)文件描述符关联。

请注意,在代码中实际记录代码的意图非常有用。 这样,其他人可以更好地理解您的代码,并且所有人(包括您)都可以更好地验证意图是否确实与实现相匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM