Неверный файловый дескриптор в функции recvfrom

Это мой серверный код для 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 раза... все равно не работает...


person Milan Shah    schedule 21.10.2016    source источник


Ответы (3)


Ваш recvfrom плохой. Вместо strlen(buffer) следует использовать sizeof(buffer). Поскольку буфер находится в стеке, у вас может быть большая строка, а затем вы переполняете буфер, если recvfrom получает большой объем данных.

Я изучу это еще немного, если это не поможет.

person No One in Particular    schedule 21.10.2016

Проблема в вашем вызове 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);
person dbush    schedule 21.10.2016

Я думаю, что вы закрываете сокет где-то еще в своей программе.

Bad file descriptor может ссылаться на неверный дескриптор файла, или он закрыт где-то еще в вашем коде, или он уже используется где-то еще. Я думаю, вам нужно немного отладить свой код, а затем хорошо управлять своим сокетом.

Возможно, ваш сокет где-то закрывается по ошибке или поврежден.

Вы также можете попробовать создать новый сокет с другим номером порта.

person Stubborn    schedule 21.10.2016
comment
ОК, попробуй, но все равно возникнет проблема, а затем также поделись своим клиентским кодом. - person Stubborn; 21.10.2016
comment
Ага... @Упрямый - person Milan Shah; 22.10.2016