簡體   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