首页 > 代码库 > webbench源码剖析

webbench源码剖析

webbench主要有两个文件组成。

socket.c

用来建立一个socket

/* $Id: socket.c 1.1 1995/01/01 07:11:14 cthuang Exp $
 *
 * This module has been modified by Radim Kolar for OS/2 emx
 */

/***********************************************************************
  module:       socket.c
  program:      popclient
  SCCS ID:      @(#)socket.c    1.5  4/1/94
  programmer:   Virginia Tech Computing Center
  compiler:     DEC RISC C compiler (Ultrix 4.1)
  environment:  DEC Ultrix 4.3 
  description:  UNIX sockets code.
 ***********************************************************************/
 
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

int Socket(const char *host, int clientPort)  
{
/* 
** 用指定主机名和端口号建立一个socket并返回
** host 主机名
** clientPort 客户端端口号
*/
    int sock;
    unsigned long inaddr;
    struct sockaddr_in ad;
    /*
    struct sockaddr_in 
    {
        short            sin_family;     // 协议簇类型 AF_INET->ipv4 , AF_INET6->ipv6
        unsigned short   sin_port;       // 端口号 htons(3490)  htons == host to net short 
                                         // 将主机字节顺序转变成网络字节顺序

        struct in_addr   sin_addr;       // ip地址
        char             sin_zero[8];    // 8 bytes zero this if you want to
    };
    struct in_addr
    {
        unsign long s_addr; //用inet_pton()返回的无符号长整形ip地址填充
    };
    */

    struct hostent *hp;
    /*
    struct hostent 
    {  
        char *h_name;  
        char **h_aliases;  
        int h_addrtype;  
        int h_length;  
        char **h_addr_list;  
    };  
    */

    // 初始化地址 
    memset(&ad, 0, sizeof(ad));
    ad.sin_family = AF_INET;

    // 尝试把主机名转化为数字 
    // 因为输入的有可能是ip地址,也有可能是域名
    // 所以要分开考虑
    inaddr = inet_addr(host);         //尝试点分十进制转为无符号长整形
    if (inaddr != INADDR_NONE)        //INADDR_NONE 代表无效的ip地址 
        memcpy(&ad.sin_addr, &inaddr, sizeof(inaddr));  //如果输入的是ip地址,直接写入sockaddr_in
    else
    {
        // 如果取得输入的是域名
        hp = gethostbyname(host); //返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针
        if (hp == NULL)
            return -1;
        memcpy(&ad.sin_addr, hp->h_addr, hp->h_length); //
    }
    ad.sin_port = htons(clientPort);  //填充本机使用端口

    // 建立 socket 
    sock = socket(AF_INET, SOCK_STREAM, 0);
    // 出错
    if (sock < 0)
        return sock;

    // 建立链接 
    // 程序员把类型、ip地址、端口填充sockaddr_in结构体,
    // 然后强制转换成sockaddr,作为参数传递给系统调用函数
    if (connect(sock, (struct sockaddr *)&ad, sizeof(ad)) < 0)      
        return -1;
    return sock;
}

 

webbench源码剖析