Deskriptor file buruk dalam fungsi recvfrom

Ini adalah kode sisi server saya untuk 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;
}

Saya mengirim buffer dari sisi klien... dan di sisi server memberi saya kesalahan seperti ini....

Deskriptor file buruk .... apa yang harus saya lakukan...

Saya juga mengubah nama deskriptor file 2 kali... masih tidak berfungsi...


person Milan Shah    schedule 21.10.2016    source sumber


Jawaban (3)


Penerimaan Anda buruk. Daripada strlen(buffer), Anda harus menggunakan sizeof(buffer). Karena buffer ada di tumpukan, Anda mungkin memiliki string besar di sana dan kemudian buffer Anda meluap jika recvfrom mendapat data dalam jumlah besar.

Saya akan mempelajarinya lagi jika itu tidak membantu.

person No One in Particular    schedule 21.10.2016

Masalahnya ada pada panggilan Anda ke recvfrom:

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

Parameter ketiga adalah ukuran buffer input. Namun sebaliknya, Anda memanggil strlen di buffer. Karena buffer tidak diinisialisasi, memanggil strlen di dalamnya berarti membaca data yang tidak diinisialisasi yang dapat menyebabkan perilaku tidak terdefinisi.

Selain itu, kecuali klien mengirimkan string yang diakhiri dengan null (yaitu beberapa karakter printer diikuti oleh byte null), panggilan ke printf juga akan memunculkan perilaku tidak terdefinisi karena byte apa pun yang melewati apa yang telah dibaca tidak akan diinisialisasi.

Masukkan ukuran buffer dikurangi 1 (untuk menyisakan ruang untuk byte nol) alih-alih memanggil strlen, dan kosongkan buffer terlebih dahulu.

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

Saya pikir Anda menutup soket di tempat lain di program Anda.

Bad file descriptor mungkin merujuk pada deskriptor file yang tidak valid atau ditutup di tempat lain dalam kode Anda atau sudah digunakan di tempat lain. Saya pikir Anda perlu sedikit men-debug kode Anda dan kemudian mengelola soket Anda dengan baik.

Ada kemungkinan soket Anda ditutup secara tidak sengaja atau rusak.

Anda juga dapat mencoba membuat soket baru dengan nomor port berbeda.

person Stubborn    schedule 21.10.2016
comment
Oke coba dan masih mendapat masalah lalu bagikan juga kode klien Anda. - person Stubborn; 21.10.2016
comment
Ya... @Keras kepala - person Milan Shah; 22.10.2016