4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-13 04:29:09 +08:00

60 lines
1.3 KiB
C

#include "select_test.h"
int
main ()
{
int sfd, cfd, flags;
fd_set readfds;
size_t nread = 0;
char buf[BUF_SIZE];
if (remove (SV_SOCK_PATH) < 0 && errno != ENOENT)
errExit ("remove");
if ((sfd = unixBind (SV_SOCK_PATH, SOCK_STREAM)) < 0)
errExit ("unixBind");
if (listen (sfd, BACKLOG) < 0)
errExit ("listen");
printf ("waiting for connection request...\n");
FD_ZERO (&readfds);
FD_SET (sfd, &readfds);
if (select (sfd + 1, &readfds, NULL, NULL, NULL) < 0)
errExit ("select");
if (FD_ISSET (sfd, &readfds))
printf ("connection request received; accepting\n");
else
errExit ("something's wrong");
cfd = accept (sfd, NULL, NULL);
if (cfd < 0)
errExit ("accept");
flags = fcntl (cfd, F_GETFL);
if (fcntl (cfd, F_SETFL, flags | O_NONBLOCK) < 0)
errExit ("fcntl");
printf ("slowly reading from socket...\n");
while (1)
{
FD_ZERO (&readfds);
FD_SET (cfd, &readfds);
if (select (cfd + 1, &readfds, NULL, NULL, NULL) < 0)
errExit ("select");
if (!FD_ISSET (cfd, &readfds))
errExit ("something's wrong");
ssize_t nr = read (cfd, buf, 10);
if (nr < 0)
{
if (errno == EPIPE)
break;
else
errExit ("read");
}
else if (nr == 0)
break;
nread += nr;
}
printf ("read %zu bytes\n", nread);
}