70,024
社区成员




int do_select (int count, const int *s, int rwx, int *out_rwx, struct timeval *timeout) {// same action for all
fd_set set[3];
int maxfd = s[0];
if (rwx < 0 || rwx > 2) {
return -1;
}
for (int i = 0; i < 3; ++i) {
FD_ZERO (set + i);
}
int fds = 0;
for (int i = 0; i < count; ++i) {
if (s[i] < 0) {
continue;
}
++fds;
FD_SET (s[i], set + rwx);
maxfd = maxfd > s[i] + 1 ? maxfd : s[i] + 1;
}
if (0 == fds) {
return 0;
}
int rt = select (maxfd, set, set + 1, set + 2, timeout);
for (int j = 0; j < 3; ++j) {
fd_set *pset = set + j;
for (int i = 0; i < count; ++i) {
if (s[i] < 0) {
continue;
}
if (FD_ISSET (s[i], pset)) {
out_rwx[i] = j;
}
}
}
return rt;
}
int
test_send (char *host, char *uri) {
if (!uri) {
uri = "/";
}
short port = 80;
int s = socket (AF_INET, SOCK_STREAM, 0);
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
struct hostent *he = gethostbyname (host);
if (!he || !he->h_addr) {
exit (1);
}
memmove (&servaddr.sin_addr, he->h_addr, he->h_length);
//servaddr.sin_addr.s_addr = *(struct in_addr *)he->h_addr;
char addrbuf[1024];
inet_ntop (AF_INET, he->h_addr, addrbuf, sizeof(addrbuf));
//inet_ntoa_r (servaddr.sin_addr.s_addr, addrbuf, sizeof(addrbuf));
short dstport = ntohs (servaddr.sin_port);
printf ("Connecting to: %s:%d\n", addrbuf, dstport);
printf ("Connecting to: %s:%d\n", inet_ntoa (servaddr.sin_addr), dstport);
int connected = connect (s, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (connected < 0) {
perror ("connect:");
exit (1);
}
printf ("connected! \n");
fd_set wset;
FD_ZERO (&wset);
FD_SET (s, &wset);
select (s + 1, 0, &wset, 0, 0);
const char *keepalive = "Connection: Close\r\n";
long kalen = 24, reqlen;
char *req = create_request (uri, strlen(uri),
host, strlen(host), keepalive, kalen, &reqlen);
char *r = req;
while (reqlen -= send (s, r, reqlen, 0)) {
r += reqlen;
}
// shutdown (s, SHUT_WR);
return s;
}
void
test_connect (char *host, char *uri) {
int s = test_send (host, uri);
fd_set wset;
FD_ZERO (&wset);
FD_SET (s, &wset);
char buf[4096];
long resplen = 0, total = 0;
while (1) {
/*
FD_ZERO (&wset);
FD_SET (s, &wset);
if (select (s + 1, &wset, 0, 0, 0) < 0) {
break;
}
if (FD_ISSET (s, &wset)) {
*/
int fdset[] = { s }, out[1];
if (do_select (1, fdset, READ, out, 0) < 1) {
perror ("do_select");
break;
}
if (out[0] == READ) {
resplen = recv (s, buf, sizeof(buf), 0);
if (resplen == 0) {
break;
}
total += resplen;
printf ("READ: %ld, TOTAL: %ld\n", resplen, total);
}
}
close (s);
}