1 #include "unp.h"
 2 
 3 int main(int argc , char**argv)
 4 {
 5     int sockfd , n; //sockfd套接字描述符
 6     char recvline[MAXLINE + 1];
 7     struct sockaddr_in servaddr;
 8     
 9     /*sockaddr_in={
10      *    short sin_family;  地址族
11      *    unsigned short sin_port; 端口号,必须采用网络数据格式,可用htons()函数将数字转换为网络数据格式
12      *    struct in_addr sin_addr;  Ip地址
13      *    unsigned char sin_zero[8];
14      */
15 
16     if (argc != 2)
17         err_quit("usage: a.out <IPaddress>");
18     if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
19         err_sys("socket error");
20 
21     bzero(&servaddr,sizeof(servaddr));//将servaddr置0
22     servaddr.sin_family = AF_INET;
23     servaddr.sin_port = htons(13);//将数字转换为网络数据格式
24     if (inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0)
25         err_quit("inet_pton error for %s",argv[1]);
26     if (connect(sockfd,(SA *) &servaddr,sizeof(servaddr)) < 0)
27         err_sys("connect error");
28     
29     while ( (n = read(sockfd,recvline,MAXLINE)) > 0){// read函数读取服务器的应答,并使用fputs输出结果
30         recvline[n] = 0;
31         if ( fputs(recvline,stdout) == EOF)
32             err_sys("fputs error");
33     }
34     if (n < 0)
35         err_sys("read error");
36 
37     exit(0);
38 }
  • 第18行socket函数原型为int socket(int af ,int type , int protocal);
    • 用途:根据指定的地址族,数据类型和协议来分配一个套接口的描述字及其所用的资源
  • 第24行的inet_pton函数原型为int inet_pton(int af , const char* src , void *dst);
    • 用途:将字符串转换为网络地址
    • af是地址族,src为来源地址,dst则是接收转换后的数据
  • 第26行的connect函数原型为 int connect(int s, const struct sockaddr * name, int namelen);
    • 用途:建立与指定socket的连接
    • s标识一个未连接的socket,name为指向要连接的套接字的sockaddr结构体的指针,namelen为sockaddr结构体的字节长度
posted on 2017-04-11 17:14  Daniel_z  阅读(286)  评论(0编辑  收藏  举报