/*****************************************************************************/ /* AllenYao 2008-12-1 */ /* 408studio@sohu.com */ /*****************************************************************************/
#include <sys/types.h> #include <sys/wait.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h>
#define MAXLINE 256 #define MAXN 16384 /* max #bytes to request from server */
int tcp_connect( char *pAddr, int nPort ); ssize_t readn( int fd, void *vptr, size_t n ); ssize_t writen( int fd, void *vptr, size_t n );
/*****************************************************************************/ /* */ /*****************************************************************************/ int main( int argc, char *argv[] ) { int i, j, fd, nchildren, nloops, nbytes; pid_t pid; ssize_t n; char request[MAXLINE], reply[MAXN]; if (argc != 6) { printf( "usage: client <#children> <#loops/child> <#bytes/request>\n" ); exit( 1 ); } nchildren = atoi( argv[3] ); nloops = atoi( argv[4] ); nbytes = atoi( argv[5] ); snprintf( request, sizeof(request), "%d", nbytes );
for (i=0; i<nchildren; i++) { if ((pid=fork()) == 0) { for (j=0; j<nloops; j++) { fd = tcp_connect( argv[1], atoi(argv[2]) ); if (fd < 0) { printf( "connect server returned %d", fd ); } writen( fd, request, strlen(request) ); if ((n = readn( fd, reply, nbytes )) != nbytes) { printf( "server returned %d bytes", n ); } close( fd );/* TIME_WAIT on client, not server */ } printf( "child %d done\n", i ); exit( 0 ); } /* parent loops around to fork() again */ } while(wait(NULL) > 0) /* now parent waits for all children */ ; if (errno != ECHILD) { printf( "wait error" ); } exit( 0 ); }
/*****************************************************************************/ /* */ /*****************************************************************************/ int tcp_connect( char *pAddr, int nPort ) { struct sockaddr_in addrin; int nSocket; if ((pAddr == NULL) || (nPort <= 0)) { return -1; } nSocket = socket( AF_INET, SOCK_STREAM, 0 ); if (nSocket < 0) { return -2; } memset( &addrin, 0x00, sizeof(addrin) ); addrin.sin_family = AF_INET; addrin.sin_addr.s_addr = inet_addr( pAddr ); addrin.sin_port = htons( nPort ); if (connect( nSocket, (struct sockaddr *)&addrin, sizeof(addrin) ) != 0) { close( nSocket ); return -3; } return nSocket; }
/*****************************************************************************/ /* */ /*****************************************************************************/ ssize_t readn( int fd, void *vptr, size_t n ) { ssize_t nleft; ssize_t nread; char *ptr;
ptr = vptr; nleft = n; while(nleft > 0) { if ((nread = read(fd, ptr, nleft)) < 0) { if (errno == EINTR) { nread = 0; /* and call read() again */ } else { return(-1); } } else if (nread == 0) { break; /* EOF */ } nleft -= nread; ptr += nread; } return(n - nleft); /* return >= 0 */ }
/*****************************************************************************/ /* */ /*****************************************************************************/ ssize_t writen( int fd, void *vptr, size_t n ) { ssize_t nleft; ssize_t nwritten; const char *ptr;
ptr = vptr; nleft = n; while(nleft > 0) { if ((nwritten = write(fd, ptr, nleft)) <= 0) { if (errno == EINTR) { nwritten = 0; /* and call write() again */ } else { return(-1); /* error */ } } nleft -= nwritten; ptr += nwritten; } return(n); }
|