一对经典的时间获取客户/服务器程序

前言

  本文通过一对经典的时间获取客户/服务器程序,展现了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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SkyWalking8.1.0 部署和使用

一、简介1、官方文档https://github.com/apache/skywalking/tree/master/docs2、功能SkyWalking是一个可观测性分析平台和应用性能管理系统&#xff0c;提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案&#xff0c;并支持多种开发语言。专为微服务、云原生架…

CGI编程学习

一&#xff0e;基本原理 CGI&#xff1a;通用网关接口&#xff08;Common Gateway Interface&#xff09;是一个Web服务器主机提供信息服务的标准接口。通过CGI接口&#xff0c;Web服务器就能够获取客户端提交的信息&#xff0c;转交给服务器端的CGI程序进行处理&#xff0c;最…

博古通今的孩子是怎么养成的?答案就在这本影响了无数中国人思想的奇书里……

▲ 点击查看“三十六计走为上计”这句话&#xff0c;相信是大家从小听到大的俗语了。除此之外&#xff0c;还有“抛砖引玉”、“顺手牵羊”、“借刀杀人”、“擒贼先擒王”等都出自经典兵书《三十六计》。《三十六计》是中国古代最伟大的兵法谋略书之一&#xff0c;集智慧韬略、…

jmeter(2)录制脚本

Jmeter脚本是以JMX格式为主 Jmeter也是支持录制的&#xff0c;支持第三方录制方式和代理录制方式。 1、第三方录制主要是通过badboy来录制&#xff0c;录制后另存为jmx格式即可。 2、Jmeter也有自己的代理&#xff0c;录制脚本前&#xff0c;我们只要启动好代理&#xff0c;手动…

Android之Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE问题解决

Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 晚上在测一个widget,前面测的好好的,后面再安装的时候发现如下错误: [2009-06-07 02:39:35 - battery] Performing sync [2009-06-07 02:39:35 - battery] Automatic Target Mode: using device HT843GZ03305 [2009…

linux硬盘转windows7,记——第一次上手UEFI电脑,将mbr硬盘的Windows7和Linux转为gpt+uefi启动...

这是篇日记&#xff0c;前面有大量的个人情绪&#xff0c;要看方法的请直接看后面。--------------------------------------------------------------------------------------------我终于上手新电脑了虽然还是用别人的旧电脑但是总算能够用上近代一点的硬件了&#xff0c;可…

20 个 .NET 6 新增的 API

DateOnly & TimeOnly.NET 6 引入了两种期待已久的类型 - DateOnly 和 TimeOnly, 它们分别代表DateTime的日期和时间部分。DateOnly dateOnly new(2021, 9, 25);Console.WriteLine(dateOnly);TimeOnly timeOnly new(19, 0, 0);Console.WriteLine(timeOnly); DateOnly date…

中国学生的最大噩梦,都来源于这个男人

全世界只有3.14 % 的人关注了爆炸吧知识会通中西经世致用说到中国古代的“全才”&#xff0c;一般人都会脱口而出沈括、张衡、祖冲之....而在明朝&#xff0c;有这么一位少有人知的“全才”式科学家&#xff0c;他的研究领域包括天文、历法、数学、军事、农业、水利....和上述的…

BASE64 编码和解码

依赖jar: import org.apache.commons.codec.binary.Base64; BASE64和其他相似的编码算法通常用于转换二进制数据为文本数据&#xff0c;其目的是为了简化存储或传输。更具体地说&#xff0c;BASE64算法主要用于转换二进 制数据为ASCII字符串格式。Java语言提供了一个非常好的BA…

类和类之间的关系解析-1

一、泛化关系 泛化关系也称继承关系&#xff0c;指的是一个类&#xff08;称为子类、子接口&#xff09;继承另外的一个类&#xff08;称为父类、父接口&#xff09;的功能&#xff0c;并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识&#xf…

转:智能卡测试操作系统技术

具有稳定、可靠的卡内操作系统是智能卡正常工作的基础&#xff0c;智能卡操作系统控制外界与智能卡之间的通信&#xff0c;管理卡片的存储空间&#xff0c;并且在卡内对于各种命令进行处理&#xff0c;所以在COS 开发过程中有必要对COS 进行充分且全面的测试。COS 的主要特点: …

Android之添加快捷方式(Shortcut)到手机桌面

在两个手机上测试,发现小米手机上添加了快捷方式后不能移除,三星手机可以。权限 要在手机桌面上添加快捷方式,首先需要在manifest中添加权限。 <!-- 添加快捷方式 --><uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"…

C# 使用阿里云发送短信

最近有个项目&#xff0c;短信服务使用的是阿里云的&#xff0c;想要使用阿里云平台的短信服务&#xff0c;首先要注册一个阿里云账号&#xff0c;由于发送短信消息需要用到短信签名、短信模板ID&#xff08;已添加并通过审核&#xff09;1、注册阿里云账号&#xff08;地址&am…

如果太阳系毁灭,这种神秘粒子就是真凶!

185年12月7日这一天&#xff0c;东汉中平二年乙丑&#xff0c;一位天文学家观测到天空出现了一颗极其明亮的星体&#xff0c;他并不知道这意味着什么。这颗突然出现于苍穹之中的星星在夜空中照耀了八个月后&#xff0c;又忽然消逝了。《后汉书天文志》中留下了这段记载&#xf…

Centos7 安装gitlab 8.7.5

简介&#xff1a;GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。1. Web框架使用Ruby on Rails。2. 基于MIT代码发布协议。3. 需要gitolite协同工作。安装要求&#xff1a;ruby 1.9.3MySQLgitgitoliteredis如果…

ocx c++

引用&#xff1a;http://www.baike.com/wiki/ocx ocx&#xff0c;使用它可以很快地在网址、台式应用程序、以及开发工具中加入特殊的功能。 编辑摘要目录 [ 隐藏 ]1 定义2 用途ocx - 定义 ActiveX控件.ActiveX控件是可重用的软件组件。 ocx - 用途 使用它可以很快地在网址、台式…

男人会为女人改变多少

男人会为女人改变多少 女人都想改造男人   从前有人说&#xff0c;女人征服男人&#xff0c;然后通过男人征服世界&#xff1b;而现在是女人改造男人&#xff0c;然后男人按照女人的意愿改造世界。女人喜欢男人&#xff0c;这八成是错不了的&#xff0c;但女人永远不满意男人…

Andorid之BINDSERVICE的使用方法总结

bindService用于绑定一个服务。这样当bindService(intent,conn,flags)后,就会绑定一个服务。这样做可以获得这个服务对象本身,而用startService(intent)的方法只能启动服务。 bindService方式的一般过程: ①新建Service类BindService。在BindService类里新建内部类MyBinder…

linux说明管道的作用,Linux管道及重定向的用途是什么

1、重定向在Linux中有时我们在命令的执行过程中&#xff0c;不想将执行结果显示到屏幕上&#xff0c;或者将其结果输出到其他位置这时就需要重定向来解决这个问题了首先了解一下Linux中的3种I/O设备&#xff1a;0&#xff1a;标准输入1&#xff1a;标准输出2&#xff1a;标准错…

磨刀不误砍柴工—Exceptionless搭配log4net记录日志

Exceptionless专注于.net平台提供实时错误和日志报告。主要包括&#xff1a;错误通知、智能分组异常、详细错误报告堆栈跟踪、支持离线、UI查看重要错误和确定优先级、仪表板上的统计信息和趋势、对异常标记为已修复&#xff0c;监视回归、将事件标记为关键等。主要是用于展示、…