博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一对经典的时间获取客户/服务器程序
阅读量:5316 次
发布时间:2019-06-14

本文共 3608 字,大约阅读时间需要 12 分钟。

前言

  本文通过一对经典的时间获取客户/服务器程序,展现了Linux网络编程的大体框架,为以后更深入的学习打下基础。

客户服务器模式网络编程的大体框架

客户端代码

1 #include 
2 // 下头文件包含socket(), bind()等套接字通信必须的函数。 3 #include
4 // 下头文件包含网际套接字变量的类型定义等。 5 #include
6 // 下头文件包含bzero()函数等 7 #include
8 // 下头文件包含errno变量等 9 #include
10 11 #define MAXLINE 100 12 13 int main (int argc, char ** argv)14 {15 // 定义套接字描述符变量sockfd16 // 定义变量n存放read函数返回值17 int sockfd, n;18 // 定义字符数组recvline存放时间查询结果19 char recvline[MAXLINE + 1];20 // 定义套接字变量servaddr( 注意这里存放的是服务器端的信息 )21 struct sockaddr_in servaddr;22 23 // 检查命令格式是否正确24 if (argc != 2) {25 puts("命令格式错误\n");26 return 1;27 }28 29 // 创建一个网际字节流套接字30 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) <0) {31 puts("网际套接字创建失败\n");32 return 2;33 }34 35 // 将套接字变量servaddr清零36 bzero(&servaddr, sizeof(servaddr));37 // 给套接字变量的协议段赋值( AF_INET表示IPv4协议 )38 servaddr.sin_family = AF_INET;39 // 给套接字变量的端口段赋值( 13是时间服务器端口 )40 servaddr.sin_port = htons(13);41 // 给套接字变量的IP段赋值( argv[1]存放服务器IP )42 if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {43 puts("IP地址格式转换失败");44 return 3;45 }46 47 // 按照先前socket函数指定的协议类型与服务器进行连接48 if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {49 puts("连接失败\n");50 return 4;51 }52 53 // 从缓冲区读取时间查询结果并放进recvline数组中54 if ( (n = read(sockfd, recvline, MAXLINE)) > 0 ) {55 recvline[n] = 0;56 puts(recvline);57 }58 if (n < 0) {59 puts("读取数据发生错误");60 }61 62 return 0;63 }

服务器端代码

1 #include 
2 3 // 下头文件包含socket(), bind()等套接字通信必须的函数。 4 #include
5 // 下头文件包含网际套接字变量的类型定义等。 6 #include
7 // 下头文件包含bzero()函数等 8 #include
9 // 下头文件包含errno变量等10 #include
11 // 下头文件包含一些时间函数12 #include
13 14 #define MAXLINE 100 15 #define LISTENQ 516 17 int main(int argc, char **argv)18 {19 // 定义监听套接字描述符listenfd20 // 定义连接套接字描述符21 int listenfd, connfd;22 // 定义套接字变量servaddr( 注意这里存放的是客户端的信息 )23 struct sockaddr_in servaddr;24 // 定义字符数组buff暂存时间25 char buff[MAXLINE];26 27 // 定义时间相关变量28 time_t ticks;29 struct tm *ptm;30 31 // 创建一个网际字节流套接字32 if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {33 puts("创建网际套接字失败\n");34 return 1;35 }36 37 // 将套接字变量servaddr清零38 bzero(&servaddr, sizeof(servaddr));39 // 给套接字变量的协议段赋值( AF_INET表示IPv4协议 )40 servaddr.sin_family = AF_INET;41 // 给套接字变量的端口段赋值( 13是时间服务器端口 )42 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);43 // 给套接字变量的IP段赋值( argv[1]存放服务器IP )44 servaddr.sin_port = htons(13);45 46 // 把指定的协议地址绑定到套接字47 if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) {48 puts("绑定服务端口失败\n");49 return 2;50 }51 // 将套接字转换为监听套接字类型52 if (listen(listenfd, LISTENQ) < 0) {53 puts("创建监听套接字失败\n");54 return 3;55 }56 57 while (1) {58 // 等待客户呼叫,若收到呼叫则返回一个已连接套接字。59 connfd = accept(listenfd, (struct sockaddr *)NULL, NULL);60 61 /*62 * 获取时间并存放进buff数组63 */64 ticks = time(NULL);65 ptm = localtime(&ticks);66 snprintf(buff, sizeof(buff), "现在是北京时间:\n%d年 %d月 %d日 %d时 %d分", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min);67 68 // 往客户端缓冲区中写入时间69 while (write(connfd, buff, strlen(buff)) < 0) {70 puts("写入数据失败\n");71 return 4;72 }73 // 关闭连接74 if (close(connfd)) {75 puts("关闭套接字失败\n");76 return 5;77 }78 }79 }

运行测试

  1. 在一个终端用超级用户权限启动服务器:

   

  2. 在另一个终端中启动客户端并输进本机IP或者127.0.0.1:

  

 

转载于:https://www.cnblogs.com/scut-fm/p/3321508.html

你可能感兴趣的文章
移动平台对 meta 标签的定义
查看>>
[转载]工作面试时最难的25个问题
查看>>
Test
查看>>
HMAC
查看>>
linux进阶命令2
查看>>
实训三(cocos2dx 3.x 打包apk)
查看>>
【基础操作】线性基详解
查看>>
Git删除分支/恢复分支
查看>>
IIS7中使用集成模式时出现HttpException
查看>>
springboot三种过滤功能的使用与比较
查看>>
获取帮助命令
查看>>
UVA-401 Palindromes
查看>>
CentOS学习笔记--程序管理
查看>>
堆栈的理解
查看>>
picturebox 图片自适应
查看>>
NOI导刊模拟2—电话网络 解题报告
查看>>
[Tyvj1114 搭建双塔]
查看>>
【代码笔记】iOS-播放从网络上下载的语音
查看>>
LeetCode 114. Flatten Binary Tree to Linked List
查看>>
ORACLE 数据库安装后,PL/SQL的登录问题完美解决
查看>>