Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38086
  • 博文数量: 10
  • 博客积分: 440
  • 博客等级: 下士
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-11 10:22
文章分类
文章存档

2011年(4)

2008年(6)

我的朋友
最近访客

分类: LINUX

2011-01-18 15:18:16

最近在考虑多进程并发服务器模型的实现,在阅读《UNIX网络编程(第一卷)》时,将其中的测试程序(客户端)实现了一下,为便于以后拷贝,特保留在下面。代码中内容可能跟书中有差异,因为书中的源码我没有找到,所以是自己曲线实现的。
 

/*****************************************************************************/
/* 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);
}

发表于: 2008-12-02 ,修改于: 2008-12-02 17:07,已浏览423次
阅读(488) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~