echo客户端和服务器

实现的基本功能: 

    客户端:发送一行文本给服务器,服务器显示收到的字节数,并返回收到的内容给客户端。

file echo.c:   

file echoclient.c:   

 1 /**客户端主程序**/
 2 int main(int argc, char **argv)//运行时,把命令行参数传入主程序。argc--命令行参数总个数,包括可执行程序名;argv[i]--第 i 个参数;argv[0]--可执行程序名。
 3 {
 4     int clientfd;//clientfd--套接字描述符;
 5     char *host, *port, buf[MAXLINE];//host--服务器主机IP地址;port-服务器端口号;buf--缓存;
 6     rio_t rio;//缓存形式
 7 
 8     if (argc != 3)
 9     {
10         fprintf(stderr, "usage: %s  \n", argv[0]);//将错误提示输入到stderr定向的设备,如显示器,文件,打印机
11         exit(0);
12     }
13     host = argv[1];
14     port = argv[2]; 
15 
16     clientfd = Open_clientfd(host, port);//建立与服务器host的连接,返回给客户端一个打开的套接字描述符,可以立即与服务器进行通信
17     Rio_readinitb(&rio, clientfd); //读到clientfd中,Robust I/O包中,带缓冲读取一行的数据,遇到'\n'结尾代表一行,返回真正读取到的字符数量
18 
19     while (Fgets(buf, MAXLINE, stdin) != NULL)//Fgets从标准输入读取文本行到buf
20     {
21         //发送文本行给服务器
22         Rio_writen(clientfd, buf, strlen(buf));    
23         //从服务器读取回送的行
24         Rio_readlineb(&rio, buf, MAXLINE);//从IO端口读入一行数据到buf
25         //输出结果到标准输出
26         Fputs(buf, stdout);//把字符串buf写入到指定的流 stdout中,但不包括空字符。
27     }
28     Close(clientfd);//关闭描述符
29     exit(0);//正常退出
30 }
View Code

file echoserver.c:   

 1 /**服务器主程序**/
 2 int main(int argc, char **argv)
 3 {
 4     int listenfd, connfd, port;//listenfd--侦听描述符;connfd--已连接描述符;port--侦听端口号;
 5     socklen_t clientlen;
 6     struct sockaddr_storage clientaddr;//套接字地址结构sockaddr_storage足够大
 7     char client_hostname[MAXLINE], client_port[MAXLINE];
 8 
 9     if (argc != 2)
10     {
11         fprintf(stderr, "usage: %s \n", argv[0]);
12         exit(0);
13     }
14 
15     listenfd = Open_listenfd(argv[1]);//打开侦听描述符,侦听服务器的端口
16     while (1)
17     {
18         clientlen = sizeof(struct sockaddr_storage);
19         //等待来自客户端的请求
20         connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);//返回前在clientaddr中填上另一端客户端的套接字地址
21 
22         //将套接字的地址结构转clientaddr换为主机和服务名字符串村早缓冲区client_hostname和client_port
23         Getnameinfo((SA *)&clientaddr, clientlen, client_hostname, MAXLINE,
24             client_port, MAXLINE, 0);
25         printf("server connected to (%s,%s)\n", client_hostname, client_port);
26 
27         //调用echo为客户端服务
28         echo(connfd);
29         Close(connfd);
30     }
31     exit(0);
32 }
View Code

补充:

"csapp.h"文件: https://blog.csdn.net/zhongshijunacm/article/details/53506892

linux RIO包 :https://blog.csdn.net/u013613341/article/details/51019075

参考:《深入理解计算机系统》

猜你喜欢

转载自www.cnblogs.com/chengmm/p/11610448.html