一对经典的时间获取客户/服务器程序
前言
本文通过一对经典的时间获取客户/服务器程序,展现了Linux网络编程的大体框架,为以后更深入的学习打下基础。
客户服务器模式网络编程的大体框架
客户端代码
1 #include <stdio.h> 2 // 下头文件包含socket(), bind()等套接字通信必须的函数。 3 #include <sys/socket.h> 4 // 下头文件包含网际套接字变量的类型定义等。 5 #include <netinet/in.h> 6 // 下头文件包含bzero()函数等 7 #include <string.h> 8 // 下头文件包含errno变量等 9 #include <errno.h> 10 11 #define MAXLINE 100 12 13 int main (int argc, char ** argv) 14 { 15 // 定义套接字描述符变量sockfd 16 // 定义变量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 <stdio.h> 2 3 // 下头文件包含socket(), bind()等套接字通信必须的函数。 4 #include <sys/socket.h> 5 // 下头文件包含网际套接字变量的类型定义等。 6 #include <netinet/in.h> 7 // 下头文件包含bzero()函数等 8 #include <string.h> 9 // 下头文件包含errno变量等 10 #include <errno.h> 11 // 下头文件包含一些时间函数 12 #include <time.h> 13 14 #define MAXLINE 100 15 #define LISTENQ 5 16 17 int main(int argc, char **argv) 18 { 19 // 定义监听套接字描述符listenfd 20 // 定义连接套接字描述符 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
一对经典的时间获取客户/服务器程序相关推荐
- 网络客户/服务器程序
编写网络客户/服务器程序,实现如下功能: (1)设计服务器程序,运行时等待客户端连接: (2)客户端设计如下界面,并在启动时与服务器建立连接: (3)客户端发送消息,服务器收到消息后,将所有小写字符转 ...
- 客户和服务器之间响应的序列,网络编程-第五讲-TCP客户-服务器程序例子.pdf-原创力文档...
网络编程 第五讲TCP客户-服务器程序例子 多进程并发服务器基本架构 pid_t pid; int listenfd, connfd; listenfd = Socket( ... ); /* fil ...
- 第十篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )
前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 ):同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程 ...
- 【UNIX网络编程】| 【03】TCP客户/服务器程序示例
文章目录 1.概述 2.TCP回射服务器程序 3.TCP回射客户程序 3.正常启动 4.正常终止 5.POSIX信号处理 5.1 signal函数 5.2 POSIX信号语义 6.处理SIGCHID信 ...
- java socket编写服务器_Java网络学习笔记1:用(Server)Socket编写简单的客户/服务器程序...
首先需清楚Socket类提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象.程序只需向数据 ...
- 第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例
TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write -- ...
- 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...
- java客户服务器程序预约口罩_团队作业(二):Github实训:口罩预约
这个作业要求在哪里 这个作业的目标 使用Github进行团队协作 其他参考文献 <构建之法> Part 1 关于此次作业 (1)组员职责分工 221701436:组织小组参与讨论分工,测试 ...
- UNP Chapter 27 - 客户-服务器程序其他设计方法
27.1. 概述 27.13. 小结 转载于:https://www.cnblogs.com/s7vens/archive/2012/04/16/2451948.html
最新文章
- Go 知识点(19)— Go 语言中的野指针
- Neo4j:绘制“我的名字是……我在工作”图
- 2022图书出版行业营销白皮书
- 统计单词数(信息学奥赛一本通-T1400)
- Delphi 发送邮件 通过Office Outlook
- 组织架构递归_映射架构和递归管理数据–第1部分
- PHP如果某商品下的所有货品库存都为0,则下架该商品
- 程序员教你十分钟做出炫酷桌面
- 手把手教,使用Oracle VM VirtualBox虚拟机安装Windows XP系统,爷青回
- 智能家居教程:基于机智云物联网开发平台的智能门锁v1.0(APP)
- 爱粤语软件:普通话和粤语转换
- java闰年的计算方法_java中对 闰年的计算 以及月份天数
- java求指数_Java Math类的常用方法,指数运算
- uni-app Image组件在加载图片发生错误时,显示默认图片
- linux inet_aton使用实例,C语言中实现inet_aton和inet_ntoa函数功能
- Canvas—绘画圆弧
- 【SVAC】SVAC标准简介
- Java图形化界面---
- 【日常】SpringBoot缓存注解器及整合redis实现(附近期一些python零碎的内容)
- android图片特效处理之锐化效果
热门文章
- jer中无html文件,index.html
- 数据库:SQLServer 实现行转列、列转行用法笔记
- oracle索引自增函数,oracle生成动态前缀且自增号码的函数分享
- java scanner接收数组_java – 使用scanner将文件中的整数读入数组
- vue怎么插入接口demo_前端学起来特别吃力,新人入前端怎么学?
- pb 插入报列在此处不_获取有关[在此处插入问题]的事实
- 白帽子技术分析会话劫持实战讲解
- Tomcat乱码解决
- Samba平台搭建和用户自行修改密码环境搭建笔记
- 学习笔记(二)JavaScript基本概念(语法,数据类型,控制语句,函数)