首页 > 其他 > 详细

echo客户端和服务器

时间:2019-09-30 00:58:04      阅读:123      评论:0      收藏:0      [点我收藏+]

实现的基本功能: 

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

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

 

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

echo客户端和服务器

原文:https://www.cnblogs.com/chengmm/p/11610448.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!