簡體   English   中英

recvfrom函數中的文件描述符錯誤

[英]Bad file descriptor in recvfrom function

這是udp的服務器端代碼

#include"headers.h"
int main(int argc,char **argv)
{
    //------------udp server socket connection------//

    int sd1;
    struct sockaddr_in serveraddr, clientaddr;
    char buffer[100];
    char *bufptr = buffer;
    int cnt=1,ret;
    socklen_t clen;
    clen=sizeof(clientaddr);

    //int buflen = sizeof(buffer);

    sd1=socket(AF_INET,SOCK_DGRAM,0);

    printf("udp socket id=%d\n",sd1);

    printf("socket created for udp..\n");

    if(sd1<0)
    {
        perror("udp_sfd");
        exit(0);
    }

    printf("server socket created..\n");

    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(atoi(argv[1]));
    serveraddr.sin_addr.s_addr=INADDR_ANY;

    if(bind(sd1,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
    {
        perror("bind\n");
        exit(0);
    }
    else
    {

        while(1)
        {
            printf("server accept from client\n");

            ret=recvfrom(sd1,(char *)bufptr,strlen(buffer),0,(struct sockaddr *)&clientaddr,&clen);
            printf("ret=%d\n",ret);

            //printf("hello\n");
            if(ret<0)
            {
                perror("recvfrom");
                exit(0);
            }
            else
            {
                printf("UDP Server received the following:\n \"%s\" message\n", bufptr);
            }
            //close(sd1);
        }
    }

    close(sd1);
    return 0;
}

我從客戶端發送緩沖區...在服務器端它給我一個這樣的錯誤....

錯誤的文件描述符....我該怎么做...

我也改變了文件描述符的名稱2次...仍然沒有工作......

你的recvfrom很糟糕。 您應該使用sizeof(緩沖區)而不是strlen(緩沖區)。 由於緩沖區位於堆棧上,因此您可能在其中有一個大字符串,如果recvfrom獲取大量數據,則會溢出緩沖區。

如果這沒有用,我會再研究一下。

問題在於您對recvfrom的調用:

ret=recvfrom(sd1,(char *)bufptr,strlen(buffer),0,(struct sockaddr *)&clientaddr,&clen);

第三個參數應該是輸入緩沖區的大小。 但相反,你在緩沖區上調用strlen 因為buffer是未初始化的,所以在其上調用strlen是讀取未初始化的數據,這可能導致未定義的行為

此外,除非客戶端發送空終止字符串(即一些打印機字符后跟空字節),否則對printf的調用也將調用未定義的行為,因為任何超過讀取內容的字節都將是未初始化的。

傳入緩沖區大小減1(為空字節留空間)而不是調用strlen ,並事先清除緩沖區。

memset(buffer, 0, sizeof(buffer));
ret=recvfrom(sd1,(char *)bufptr,sizeof(buffer)-1,0,(struct sockaddr *)&clientaddr,&clen);

我認為你正在關閉程序中的其他地方的套接字。

Bad file descriptor可能引用無效的文件描述符,或者在代碼中的其他位置關閉,或者它已在其他地方使用。 我認為您需要稍微調試一下代碼,然后很好地管理您的套接字。

您的套接字可能被錯誤地關閉或被損壞。

您也可以嘗試使用不同的端口號創建新套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM