recvfrom函数中的文件描述符错误

时间:2016-10-21 09:31:11

标签: c sockets udp

这是我的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次......仍然无法正常工作......

3 个答案:

答案 0 :(得分:1)

你的recvfrom很糟糕。您应该使用sizeof(缓冲区)而不是strlen(缓冲区)。由于缓冲区在堆栈上,你可能在那里有一个大字符串,如果recvfrom获取大量数据,你就会溢出缓冲区。

如果没有帮助,我会更多地研究它。

答案 1 :(得分:1)

问题在于您致电recvfrom

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

第三个参数应该是输入缓冲区的大小。但相反,你在缓冲区上调用strlen。由于buffer未初始化,因此在其上调用strlen正在读取可能导致undefined behavior的未初始化数据。

此外,除非客户端发送空终止字符串(即一些打印机字符后跟空字节),否则对printf的调用也将调用未定义的行为,因为任何超过读取内容的字节都将是未初始化的。< / p>

传入缓冲区大小减1(为空字节留空)而不是调用strlen,并事先清除缓冲区。

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

答案 2 :(得分:0)

我认为你正在关闭程序中的其他地方的套接字。

Bad file descriptor可能引用无效的文件描述符,或者在代码中的其他位置关闭,或者它已在其他地方使用。我认为你需要稍微调试你的代码,然后很好地管理你的插槽。

您的套接字可能在某处被错误地关闭或被损坏。

您可以尝试使用不同的端口号创建新套接字。