Question about socket

jameszxj jameszxj at gmail.com
Tue Jan 2 07:10:42 UTC 2018


The problem is caused by the define of FD_SETSIZE


The default FD_SETSIZE is 64


I redefine FD_SETSIZE or change select to poll, The tcp server runs correctly.



------------------ Original ------------------
From:  "jameszxj";<jameszxj at gmail.com>;
Date:  Thu, Dec 28, 2017 10:47 AM
To:  "rtems-users at rtems.org"<users at rtems.org>;

Subject:  Question about socket



I use the rtems version on github, and configure it use libbsd network library. 
I config rtems file descriptors as 200
#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS     200

and run tcp server on the board.

static void vtio_task(rtems_task_argument arg)
{
    struct sockaddr_in l_addr;
    int addrlen;
    int s = socket(AF_INET, SOCK_STREAM, 0);

    if (s < 0)
    {
        printf("creat socket error.\n");
        return;
    }

    memset(&l_addr, 0, sizeof(l_addr));
    l_addr.sin_family = AF_INET;
    l_addr.sin_port = htons(6789);
    l_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    int ret = bind(s, (const struct sockaddr *) &l_addr, sizeof(struct sockaddr));
    if (ret < 0)
    {
        printf("bind socket error.\n");
        return;
    }
    
    ret = listen(s, 5);
    if (ret < 0)
    {
        printf("listen socket error.\n");
        return;
    }


    while(1)
    {
        struct fd_set read_set;

        int sock = accept(s, (struct sockaddr *)&l_addr, (socklen_t *)&addrlen);

        printf("new socket %d\n", sock);
        while(1)
        {
            FD_ZERO(&read_set);
            FD_SET(sock, &read_set);

            ret = select(sock+1, NULL, &read_set, NULL, NULL);
            if (ret <= 0)
            {
                perror("select error");
                close(sock);
                break;
            }

            ret = recv(sock, buf, 1024, 0);
            if (ret > 0)
            {
                send(sock, buf, ret, 0);
            }
            else
            {
                perror("recv error");
                close(sock);
                break;
            }
        }
    }
}

I run a test(connect=>write=>disconnect   cyclic) from PC,  When socket number>=65,the select,send,recv functions returns error. errno message:(select error: Bad file number)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20180102/fc797a8c/attachment.html>


More information about the users mailing list