LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

1.3socket编程客户端-服务端基本流程图片App

2023年1月20日 42点热度

0.概要简介

本章介绍了服务器-客户端的基本架构unix网络编程实用技术与实例分析unix网络编程实用技术与实例分析,socket套接字,从OSI模型层面分析socke的作用,提供了一个时间服务的客户端和服务端的最小实现。本章学完后应该对网络编程有一个直观的印象。

image.png

重点是1,2,5,7节。

1.知识总结1.1 客户端-服务端架构

要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的协议(protocol)。在深入设计一个协议的细节之前,应该从高层次决断通信由哪个程序发起以及响应在何时产生。举例来说,一般认为Web服务器程序是一个长时间运行的程序(即所谓的守护程序,daemon),它只在响应来自网络的请求时才发送网络消息。协议的另一端是Web客户程序,如某种浏览器,与服务器进程的通信总是由客户进程发起。大多数网络应用就是按照划分成客户(client)和服务器(server)来组织的。

1.2 OSI模型与socket编程接口

OSI的7层模型是老生常谈的内容了,但是之前每次看的时候仅限于记忆,并没有深入的理解。

图片发自简书App

对于一个新的事物如果仅仅是记忆概念,对之没有其他更多的操作实践,那么算不上理解掌握了它。之前也接触过OSI的7层模型,但总是感觉概念无法实际落地。看完本章关于socket编程接口和协议模型的论述,对协议觉理解加深了一步。简单的说socket编程接口是上三层(应用层、表示层、会后层)进入传输层的接口。

本书讲述的套接字编程接口是从顶上三层(网际协议的应用层)进入传输层的接口。本书的焦点是:如何使用套接字编写使用TCP或者UDP的网络应用程序。

1.3 socket编程客户端-服务端基本流程

图片发自简书App

2.动手实验

本章实验基于安装了Ubuntu系统的台式机和安装了lubuntu系统的cubieboard cc-a80开发板,进行两个实验:

2.1 实验代码

作者在前言中已经给出了书中代码的下载地址,但我总觉得还是自己手动敲一遍理解更深。作者把常用的头文件、错误处理、socket接口均封装成响应的文件,实验学习过程代码组织目录结构保持和书中一致,具体实现本着用到什么实现什么的原则。为了分享,笔者在github上建立一个仓库,地址如下:

├── intro

│ ├── daytimetcpcli.c

│ ├── daytimetcpcli.mk

│ ├── daytimetcpsrv.c

│ └── daytimetcpsrv.mk

unix网络编程实用技术与实例分析_unix环境高级编程 学习方法_unix shell 实例精解

├── lib

│ ├── libwrapsock.mk

│ ├── unp.h

│ └── wrapsock.c

目录结构如下,intro目录下是第一章的两个程序所在目录,在该目录下提供了两个makefile,例如执行

make -f daytimetcpcli.mk

就可以编译获取时间的客户端程序,服务端的程序类似。lib目录是库函数目录,当前只有socket接口的包裹函数和unp.h头文件,后续随着学习的深入,逐渐完善。本书的后续学习实验代码均会更新到该仓库。

为了便于后续服务端实验,在客户端和服务端的程序将端口号统一用MY_DAY_TIME_SERVER_PORT宏给出LINUX社区,第一个实验中该宏设置为13(系统时间服务端口号固定为13),第二个实验中该宏设置为一个未被使用的端口即可(笔者实验代码中使用的是45000)。

2.2获取时间客户端

#include"unp.h"
#define MAXLINE (256)
int main(int argc, char **argv)
{
    // 1. 参数校验
    if (argc != 2){
        printf("usage: a.out n");
        exit(0);
    }
    // 2. 建立socket
    int sockfd = 0;
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){

printf("socket error!n"); exit(0); } // 3. 建立连接 struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(MY_DAY_TIME_SERVER_PORT); if (inet_pton(AF_INET, argv[1], &addr.sin_addr) < 0){ printf("inet_pton error for %sn", argv[1]); exit(0); } if ( connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) 0 ){ recvline [n] = 0;

unix网络编程实用技术与实例分析_unix shell 实例精解_unix环境高级编程 学习方法

printf("%sn", recvline); } if (n<0){ printf("read error!n"); } exit(0); }

$ daytimetcpcli 127.0.0.1

执行过程出现如下错误。

connect error!

百度一番red hat linux,有人说是由于系统的时间服务未开启,按照如下操作开启系统时间服务。

安装服务

apt-get install xinetd

配置

 sudo vi /etc/xinetd.d/daytime

将其中的disable 值改为no。

unix网络编程实用技术与实例分析_unix shell 实例精解_unix环境高级编程 学习方法

重启服务

sudo /etc/init.d/xinetd restart 

再次执行,正常获取到时间,结果如下

$ daytimetcpcli  127.0.0.1
31 DEC 2017 14:38:36 CST

2.3 获取时间服务端实验

#include "unp.h"
#include 
int main(int argc, char **argv)
{
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buffer[MAXLINE];
    time_t ticks;
    listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

unix shell 实例精解_unix网络编程实用技术与实例分析_unix环境高级编程 学习方法

servaddr.sin_port = htons(MY_DAY_TIME_SERVER_PORT); Bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); for(;;){ connfd = Accept(listenfd, (struct sockaddr *)NULL, NULL); ticks = time(NULL); snprintf(buffer, sizeof(buffer), "MY_DAY_TIME_SERVER:%s.24sn", ctime(&ticks)); Write(connfd, buffer, strlen(buffer)); Close(connfd); } }

linaro@cubieboard4:~$ daytimetcpsrv&

Ubuntu端使用客户端发起访问

$ daytimetcpcli 192.168.20.100
MY_DAY_TIME_SERVER:Sun Dec 31 14:26:28 2017

这里的192.168.20.100是cc-a80的IP地址。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: socket
最后更新:2023年1月20日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux系统用户系统上的三种类型的帐户的介绍 Linux下的开机启动设置方法是什么?脚本或服务 谷歌更新Linux内核构建的公共内核库:添加对kokoro作业的支持 linux下mysql中可以使用REVOKE语句来删除某个用户的权限 内核的角度来看,调用hotplug和通常的hotplug环境 Linux系统在开机的时候自动加载某些脚本或系统服务 如何在Linux上安装Diablo3操作系统Diablo3 RedHatLinux软件安装包软件后缀为.rpm最初 1.1.4Linux的内核版本和发行版本是什么意思?(图) Linux系统的安装-Ubuntu开启虚拟机安装过程默认注意事项 hello_exit函数代码存放在__init段中(一) 英伟达将LinuxGPU内核模块作为开放源码/MIT双重许可证(图) virtualboxlinux官方版免费、小巧,同时支持Windows、Linux和Mac系统主机 Linux平台下的嵌入式软件要具备说明技能吗? 图解linuxlinux内核结构框图对内核框图有个总体的把握 linux虚拟机的安装步骤是什么?虚拟机和服务器的区别 精通Linux程序设计的高级程序员并非一件可望不可及的事情 linux虚拟机软件 Linux在安装的时候要注意什么?Linux安装注意事项 Python都有哪些应用,学习完成Python后能的工作方向 微软考虑用Rust开发内核的Linux内核-Hartman
Linux5.12的推送请求不断涌入新开放的合并窗口预计4月底看到它的稳定版本go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由腾讯云服务器上也搭建一套环境,安装成功自动启动个人笔记本安装Ubuntu20.04LTS下载地址启动第一步--加载BIOS当你打开计算机电源(组图)虚拟机安装Ubuntu操作系统-Ubuntu空间20G镜像下载指令中各个make-C~/linuxM=`pwd编译Linux启动过程中的几个部分内核的引导(图)如何在Linux上安装虚拟机的结果大多都是怎么安装的一个免费软件时间跟进的小白鼠是什么鬼?专题计算机是如何启动的?、内核操作系统的启动流程学习Linux最简单、最实用的环境就是虚拟机环境(上)基于命令修改文件的权限命令-ld1.Linux磁盘分区和目录Linux发行版本之间的差别很少?国内性价比很高的Linux虚拟主机系统安装的流程是什么?Linux下修改文件权限的权限与所有权的实现就显得很有必要linux到底难不难学呢?推荐可以查看Linux命令大全Linux中修改文件权限的命令、创建者所在组、所有人Linux的内核放在了哪里?/boot的启动目录一览阿里云>社区>主题地图S>查看存储推荐
Linux强烈建议采用自定义的系统服务实现开机启动程序的脚本方法 Linux里并没有安装rsync的安装过程及安装 豆瓣高评分书籍,快来看看你都读过哪几本? Linux常用应用工具软件安装管理——RedHatEnterprise存储库 Linux磁盘管理常用三个命令为df、du、fdisk和fdisk :2管理大部分命令的组成 【Linux基础知识】Linux下的共享库和动态库 web应用漏洞/心脏滴血8069zabbix服务远程命令执行/注入8161activemq弱口令 对比Linux和Windows,那macOS和Linux有什么区别? 学习Linux的8个简单教程,开始你的Linux之旅 0x02影响版本LinuxKernel5.405.50x03修复建议 告诉我们哪个Linux发行版对游戏支持的**.. linux中命令介绍Cat命令(concatenate命令)介绍命令 不同服务器启动不同端口一样修改教程 10.5内核定时器编程TIMER_SOFTIRQ软中断,运行当前处理器CPU上到期的所有定时器 Linux系统中的批量管理进程的工具 如需最新mainline内核版本下载并安装新版本删除旧内核 Linux内核启动注册中断内核中断源如何实现多个定时器 MicrosoftLinux内核将作为Windows10的一部分包括在内包括 如何在win10环境下使用vmware搭建本地计算机的虚拟机?
标签聚合
电脑 linux系统 shell 软件 sudo 文件目录 unix 虚拟机 命令模式 linux服务器
书籍
课程
技术群
技术干货大合集↓
  • 2023年2月 / 12篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.