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结构体的字节长度