实现的基本功能:
客户端:发送一行文本给服务器,服务器显示收到的字节数,并返回收到的内容给客户端。
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 }
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 }
补充:
"csapp.h"文件: https://blog.csdn.net/zhongshijunacm/article/details/53506892
linux RIO包 :https://blog.csdn.net/u013613341/article/details/51019075
参考:《深入理解计算机系统》