标签:struct 参数传递 网络字节顺序 cli inet_addr else wan bytes lis
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; }
标签:struct 参数传递 网络字节顺序 cli inet_addr else wan bytes lis
原文地址:http://www.cnblogs.com/liuyubin233/p/6686038.html