Changeset 24de663 in network-demos


Ignore:
Timestamp:
Jun 11, 1999, 2:10:59 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.11, master, netdemos-4-5-branch, network-demos-4-10-branch, network-demos-4-6-branch, network-demos-4-7-branch, network-demos-4-8-branch, network-demos-4-9-branch, rtems-4-5-branch
Children:
45c129b
Parents:
2cf4ec4
Message:

Patch from Ian Lance Taylor <ian@…> to test new "interrupt-ish"
driven select on socket support.

After the patch to RTEMS, I have appended a patch to
netdemos-19990407/select/test.c to test the new functionality and
demonstrate one way it might be used. To run the new test instead of
the select test, change doSocket to call echoServer2 instead of
echoServer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • select/test.c

    r2cf4ec4 r24de663  
    3030#define CLIENT_COUNT    2
    3131
    32 static void
    33 echoServer (unsigned short port)
     32static int clientfd[CLIENT_COUNT];
     33
     34static void
     35getClients (unsigned short port)
    3436{
    3537        int s, s1;
    3638        struct sockaddr_in myAddr, farAddr;
    3739        int addrlen;
    38         rtems_id tid;
    39         rtems_task_priority my_priority;
    40         rtems_status_code sc;
    41         char c = 'a';
    42         fd_set clientfdset;
    43         int clientCount, clientfd[CLIENT_COUNT];
    44         int topfd = 0;
    45 
    46         FD_ZERO (&clientfdset);
     40        int clientCount;
     41
    4742        printf ("Create socket.\n");
    4843        s = socket (AF_INET, SOCK_STREAM, 0);
     
    7166                else
    7267                        printf ("ACCEPTED:%lX\n", ntohl (farAddr.sin_addr.s_addr));
     68                clientfd[clientCount] = s1;
     69        }
     70
     71        close (s);
     72}
     73
     74static void
     75echoServer (unsigned short port)
     76{
     77        fd_set clientfdset;
     78        int clientCount;
     79        int topfd = 0;
     80
     81        getClients (port);
     82
     83        FD_ZERO (&clientfdset);
     84
     85        for (clientCount = 0 ; clientCount < CLIENT_COUNT ; clientCount++) {
     86                int s1;
     87
     88                s1 = clientfd[clientCount];
    7389                FD_SET (s1, &clientfdset);
    7490                if (s1 > topfd)
    7591                        topfd = s1;
    76                 clientfd[clientCount] = s1;
    7792        }
    7893
     
    116131                                        printf ("EOF\n");
    117132                                        FD_CLR (fd, &clientfdset);
     133                                        close (fd);
    118134                                        if (--clientCount == 0)
    119135                                                return;
     
    125141}
    126142
     143static rtems_id tid;
     144
     145static void
     146wakeup (struct socket *so, caddr_t arg)
     147{
     148        rtems_event_send (tid, RTEMS_EVENT_0 + (int) arg);
     149}
     150
     151static void
     152echoServer2 (port)
     153{
     154        struct sockwakeup sw, sw2;
     155        int swlen;
     156        int clientCount;
     157        rtems_event_set clientEvents;
     158
     159        getClients (port);
     160
     161        sw.sw_pfn = &wakeup;
     162        clientEvents = 0;
     163        for (clientCount = 0 ; clientCount < CLIENT_COUNT ; clientCount++) {
     164                sw.sw_arg = (caddr_t) clientCount;
     165                if (setsockopt (clientfd[clientCount], SOL_SOCKET,
     166                                SO_RCVWAKEUP, &sw, sizeof sw) < 0)
     167                        rtems_panic ("setsockopt failed: %s",
     168                                     strerror (errno));
     169                swlen = sizeof sw2;
     170                if (getsockopt (clientfd[clientCount], SOL_SOCKET,
     171                                SO_RCVWAKEUP, &sw2, &swlen) < 0)
     172                        rtems_panic ("getsockopt failed: %s",
     173                                     strerror (errno));
     174                if (swlen != sizeof sw2
     175                    || sw2.sw_pfn != &wakeup
     176                    || (int) sw2.sw_arg != clientCount)
     177                        rtems_panic ("getsockopt mismatch");
     178
     179                clientEvents |= RTEMS_EVENT_0 + clientCount;
     180        }
     181
     182        if (rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_LOCAL_NODE, &tid)
     183            != RTEMS_SUCCESSFUL)
     184          rtems_panic ("rtems_task_ident failed");
     185
     186        for (;;) {
     187                rtems_event_set events;
     188                rtems_status_code status;
     189                int i;
     190
     191                status = rtems_event_receive (clientEvents,
     192                                              RTEMS_WAIT | RTEMS_EVENT_ANY,
     193                                              RTEMS_MILLISECONDS_TO_TICKS (5000),
     194                                              &events);
     195
     196                if (status == RTEMS_TIMEOUT) {
     197                        printf ("Timeout\n");
     198                        continue;
     199                }
     200
     201                for (i = 0; i < CLIENT_COUNT; ++i) {
     202                        if (events == 0)
     203                                break;
     204                        if (events & (i + RTEMS_EVENT_0)) {
     205                                int fd;
     206                                char buf[200];
     207                                int nread;
     208
     209                                fd = clientfd[i];
     210                                printf ("Activity on file descriptor %d.\n", fd);
     211                                events &= ~ (i + RTEMS_EVENT_0);
     212                                nread = read (fd, buf, sizeof buf);
     213                                if (nread < 0) {
     214                                        printf ("Read error %s.\n", strerror (errno));
     215                                        return;
     216                                }
     217                                if (nread == 0) {
     218                                        printf ("EOF\n");
     219                                        clientEvents &= ~ (i + RTEMS_EVENT_0);
     220                                        close (fd);
     221                                        if (--clientCount == 0)
     222                                                return;
     223                                }
     224                                printf ("Read %d.\n", nread);
     225                        }
     226                }
     227        }
     228}
     229
    127230void
    128231doSocket (void)
Note: See TracChangeset for help on using the changeset viewer.