Linux 网络开发必学课程(一)网络编程的概念与模式、服务端编程初体验

2023-05-16

1网络编程的概念与模式

网络编程的本质

使用操作系统提供的接口函数,使得应用程序具备收发网络数据的能力。

  • 网络接口在代码层面是操作系统提供的函数
    • 网络编程只是一系列系统函数的花式玩法
  • 应用程序通过网络接口使用操作系统的联网能力
    • 网络编程是特定领域的C语言程序设计

网络编程核心概念

  • 协议:为进行数据通信而预定义的数据规则
  • 地址:网络通信中的用于标识设备的整数值
  • 端口号:
    • 设备为收发数据而指定的数值,用于标识具体连接
    • 可理解为:设备中用于网络通信的数据通道
  • 角色
    • 服务端:等待连接的设备
    • 客户端:发起连接的设备

网络知识充电站

  • 网址就是IP地址吗? URL是什么,域名又是什么?
    • 网址不是IP地址(设备地址),是网络信息资源的地址(如:具体网页的地址),即:URL
    • 域名是IP地址的别名,多个域名可指向同一个IP地址( 域名和IP是映射关系; 通过DNS查询到IP,域名==>DNS==>IP地址 )
  • 协议一定是看不懂的二进制数据吗?
    • 协议是一种约定即:预先定义的规则
    • 协议可以基于文本定义,也可以基于二进制定义
  • 小端系统
    • 采用小端模式(little-endian)的系统,即:数据低字节放在内存低地址中
  • 大端系统
    • 采用大端模式(big-endian)的系统,即:数据低字节放在内存高地址中
  • 网络字节序
    • 网络字节顺序采用大端模式,所以:在小端系统中需要做字节序转换

网络编程模式

⑤ 初探网络编程接口

#include <sys/types.h>

#include <sys/socket.h>

⑥ 编写网络实验

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define JR_SUCCESS                       0
#define JR_FAILURE                      -1

int main()
{
    int sock = 0;
    struct sockaddr_in addr = {0};
    char* tosend = "GET /index.html HTTP/1.1\nHOST: www.dt4sw.com\nUser-Agent: TEST\nConnection: close\n\n";
    int len = 0;
    char buf[128] = {0};
    int r = 0;

	// 准备网络连接 申请系统资源
    sock = socket(PF_INET, SOCK_STREAM, 0);
    if( sock == JR_FAILURE )
    {
        printf("socket error\n");
        return JR_FAILURE;
    }

	// 连接远程设备
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("47.99.217.175"); 	// inet_addr 字符串转为符合网络字节序的整型
    addr.sin_port = htons(80); 							// htons 本机字节序转换为网络字节序
    if( connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == JR_FAILURE )
    {
        printf("connect error\n");
        return JR_FAILURE;
    }

    printf("connect success\n");

    len = send(sock, tosend, strlen(tosend), 0);

    printf("send bytes = %d\n", len);

    len = 0;

    do
    {
        int i = 0;

        r = recv(sock, buf, sizeof(buf), 0);

        if( r > 0 )
        {
            len += r;
        }

        for(i=0; i<r; i++)
        {
            printf("%c", buf[i]);
        }

    } while ( r > 0 );

    printf("\n");
    printf("recv bytes = %d\n", len);

	// 关闭连接
    close(sock);

    return 0;
}

2、服务端编程初体验

客户端/服务端 编程模式 (c/s模型)

  • 服务端长期暴露于网络,并等待客户端连接
  • 客户端发起连接动作,并等待服务端回应
  • 特点:
    • 服务端无法主动连接客户端
    • 客户端只能按照预定义的方式连接服务端

服务端编程模式

  1. 准备网络连接
  2. 绑定端口
  3. 进入端口监听状态
  4. 等待连接(当连接上时,返回与客户端通信的socket

服务端核心工作:绑定&监听&接收

        1. 绑定

                int bind( int sock, struct sockaddr* addr,socklen_t addrlen );

        2. 监听

                int listen( int sock, int backlog ); // backlog:队列长度,服务几个客户端

        3. 接收(返回与客户端进行通信的socket

                int accept( int sock, struct sockaddr* addr,socklen_t* addrlen );// 与客户端通信的socket

深度剖析服务端

  • 服务端socket只用于接收连接,不进行实际通信
  • 当接收到连接时,accept()函数返回与客户端通信的socket
  • 服务端socket产生用于通信的客户端socket

⑤ 深入理解 socket()函数

  • socket()是什么?  本质是提供通信能力。
    • socket()是一个“多功能”函数
  • socket()返回的又是什么?
    • socket()返回值是用于通信的资源标识符
  • socket()还能做什么?
    • socket()可提供不同类型的通信功能(本地进程间通信)

客户端/服务端 编程的核心模式

  • 服务端长时间运行(死循环)接收客户端请求
  • 客户端连接后向服务端发送请求(协议数据)

客户端/服务端 编程实验

  1. 服务端持续监听客户端连接
  2. 服务端被连接后echo客户端数据(echo:返回相同数据)
  3. 服务端接收到quit后断开连接
  4. 客户端接收用户输入并发送到服务端

编程实验 :客户端/服务端 编程实验

client

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int sock = 0;
    struct sockaddr_in addr = {0};
    int len = 0;
    char buf[128] = {0};
    char input[32] = {0};
    int r = 0;

    sock = socket(PF_INET, SOCK_STREAM, 0);

    if( sock == -1 )
    {
        printf("socket error\n");
        return -1;
    }

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("39.99.145.220");
    addr.sin_port = htons(8888);

    if( connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1 )
    {
        printf("connect error\n");
        return -1;
    }

    printf("connect success\n");

    while( 1 )
    {
        printf("Input: ");

        scanf("%s", input);

        len = send(sock, input, strlen(input) + 1, 0);

        r = recv(sock, buf, sizeof(buf), 0);

        if( r > 0 )
        {
            printf("Receive: %s\n", buf);
        }
        else
        {
            break;
        }
    }

    close(sock);

    return 0;
}

server

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int server = 0;
    struct sockaddr_in saddr = {0};
    int client = 0;
    struct sockaddr_in caddr = {0};
    socklen_t asize = 0;
    int len = 0;
    char buf[32] = {0};
    int r = 0;

    server = socket(PF_INET, SOCK_STREAM, 0);

    if( server == -1 )
    {
        printf("server socket error\n");
        return -1;
    }

    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    saddr.sin_port = htons(8888);

    if( bind(server, (struct sockaddr*)&saddr, sizeof(saddr)) == -1 )
    {
        printf("server bind error\n");
        return -1;
    }

    if( listen(server, 1) == -1 )
    {
        printf("server listen error\n");
        return -1;
    }

    printf("server start success\n");

    while( 1 )
    {
        asize = sizeof(caddr);

        client = accept(server, (struct sockaddr*)&caddr, &asize);

        if( client == -1 )
        {
            printf("client accept error\n");
            return -1;
        }

        printf("client: %d\n", client);

        do
        {
            r = recv(client, buf, sizeof(buf), 0);

            if( r > 0 )
            {
                printf("Receive: %s\n", buf);

                if( strcmp(buf, "quit") != 0 )
                {
                    len = send(client, buf, r, 0);
                }
                else
                {
                    break;
                }
            }

        } while ( r > 0 );

        close(client);
    }
    
    close(server);

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 网络开发必学课程(一)网络编程的概念与模式、服务端编程初体验 的相关文章

  • 云计算ACP练习题(一)

    阿里云计算绿网是云盾体系内的业务防护模块 xff0c 它的作用是保护网站内容的安全 xff0c 提前发现不符合政策规定的信息 以下对绿网功能的描述最准确的是 A 自动判别文本内容和图片是否合规 xff0c 支持API批量检测图片 B 只支持
  • 解决Linux字符界面中文变方框的问题

    图形界面控制台中输入init 3可以跳转到字符界面 xff0c 如果遇到含有中文目录且中文变成方框的问题 xff0c 可以尝试安装zhcon xff0c 然后做一下设置 xff0c 具体步骤如下 xff1a 终端下输入 xff1a sudo
  • 【报错解决方案】W: GPG error: http://dl.google.com/linux/chrome/deb stable InRelease

    0x00 问题描述 今天用apt update 更新apt源的时候 xff0c 曝出了 xff1a W GPG error http dl google com linux chrome deb stable InRelease The f
  • 磁盘满载导致的ubuntu远程连接xrdp失效问题

    远程连接断开主要三大原因 xff1a sshd服务和Xrdp服务未打开 防火墙拦截 电脑故障 SSHD网络服务和XRDP服务检测可以通过端口号监听查看service sshd status service xrdp status 也可以直接
  • MySQL入门指南3(常用函数)

    目录 一 常用函数 1 合计 统计函数 2 字符串相关函数 3 数学相关函数 4 加密和系统函数 5 流程控制函数 二 最后的话 一 常用函数 1 合计 统计函数 1 1 COUNT 用于统计表中记录 xff08 行 xff09 的数量 x
  • PAT A1153

    题目 xff1a https pintia cn problem sets 994805342720868352 problems 1071785190929788928 这道题我很久才AC xff0c 主要是不知道原来它的输入可以乱来 我
  • 在anaconda中新建和配置开发环境

    在anaconda中新建和配置开发环境 1 打开anaconda xff0c 来到主界面 2 单击Environment xff0c 进入开发环境列表 3 单击Open Terminal 进入命令行 4 在命令行中输入conda creat
  • 深度学习安装libmr\win10安装visual studio C++ build tools 提示安装包丢失或毁坏

    首先是做深度学习需要安装libMR xff0c 但苦于windos安装需要下载包导入而不能直接pip xff1a 这部分参考 35条消息 Python 在Windows环境安装libMR SuGarSJL的博客 CSDN博客 https b
  • 树莓派Raspberry Pi 3B+ 安装OpenWrt及配置(有线、无线联网,AP)

    OpenWrt官方介绍 OpenWrt项目是一个针对嵌入式设备的Linux操作系统 OpenWrt不是一个单一且不可更改的固件 xff0c 而是提供了具有软件包管理功能的完全可写的文件系统 这使您可以不使用供应商提供的应用程序选择和配置 x
  • 最大公约数(greatest common divisor)

    题目描述 有n个数字a1 a2 a3 an 求max gcd ai aj i 61 j gcd x y 表示x与y的最大公约数 输入格式 第一行一个整数n 之后一行n个数 xff0c 表示a1 a2 a3 an 输出格式 输出一个整数表示答
  • 尝试解读resize-observer-polyfill源码(1)

    00本人前端菜鸡一只 xff0c 这是我的第一个源码解读文章 xff0c 持续更新中 首先 xff0c 从获取源码 由工程根目录下的rollup config js可知 xff0c 这个工程是使用rollup打包的 打开之后可以看到具体配置
  • Spring cloud Gateway 指定执行过滤器 (在配置文件中配置所需要过滤器)

    gateway 相关文章 Spring cloud gateway 处理跨域问题 Spring cloud gateway 拦截请求404 等HTTP 状态码 Spring cloud gateway 修改response 截断问题 xff
  • spring cloud gateway 处理跨域问题

    Spring cloud gateway 设置https 和http同时支持 Spring cloud gateway 拦截请求404 等HTTP 状态码 Spring cloud gateway 修改response 截断问题 xff0c
  • IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

    目录 满满的都是干货 所有插件都是在 ctrl 43 alt 43 s 里的plugins 里进行搜索安装 1 CodeGlance 代码迷你缩放图插件 2 Codota 安装 xff1a 3 Material Theme UI 4 Ali
  • elasticsearch 安装常见问题解决办法

    本文章记录安装es过程中碰到的各种常见问题及解决方案 目录 本文章记录安装es过程中碰到的各种常见问题及解决方案 1 elasticsearch 7 6 1 bin elasticsearch 启动报以杀死 这个问题 没有生成其他日志 只有
  • mysql my.ini

    Mysql my ini client 设置mysql客户端默认字符集 default character set 61 utf8 mysql 设置mysql客户端默认字符集 default character set 61 utf8 us
  • 看了这篇文!你就知道是选 elasticsearch 还是 solr

    什么是全文搜索引擎 本词条由 科普中国 科学百科词条编写与应用工作项目 审核 全文搜索引擎就是通过从互联网上提取的各个网站的信息 xff08 以网页文字为主 xff09 而建立的数据库中 xff0c 检索与用户查询条件匹配的相关记录 xff
  • GitHub宣布现在对团队免费

    原文 xff1a GitHub宣布对所有人私有仓库免费 https github blog 2020 04 14 github is now free for teams 我们很高兴地宣布 xff0c 我们正在为所有GitHub帐户提供不受
  • 知道什么是CAP吗?不知道还敢称程序员?搞笑呢?

    分布式系统 xff08 distributed system xff09 正变得越来越重要 xff0c 大型网站几乎都是分布式的 分布式系统的最大难点 xff0c 就是各个节点的状态如何同步 CAP 定理是这方面的基本定理 xff0c 也是
  • 面试官问:你讲讲分布式事务问题的几种方案?

    本文转自 芋道源码 https mp weixin qq com s 9KKY3pCKNkz1VOVEzdXp5g 面试题 面试官心理分析 面试题剖析 两阶段提交方案 XA方案 TCC 方案 本地消息表 可靠消息最终一致性方案 最大努力通知

随机推荐

  • spring 事务不生效的几种情况

    在这里就不接受spring 事务的ACID特性 事务的传播行为等等 xff0c 相信看到这篇的大佬们应该也对事务有所了解了不过多阐述 直接分析事务不生效的原因 开喽 xff01 情况 xff08 一 xff09 xff1a 64 Descr
  • Spring cloud gateway 设置https 和http同时支持

    Spring cloud gateway 处理跨域问题 Spring cloud gateway 拦截请求404 等HTTP 状态码 Spring cloud gateway 修改response 截断问题 xff0c 乱码问题解决 Spr
  • 一场HttpClient调用流未关闭引发的java 程序假死

    生成环境突然假死 xff0c nginx 也打不过去 xff0c nnnnnnnn 以为是启动时间久了 xff0c 随手在启动 xff0c 没过几分钟 程序继续假死 xff0c 查看nginx 日志 有很多请求 xff0c 所以问题无法进行
  • 列表拖拽,上下移动 java 接口实现

    列表拖拽实现 上下移动实现 列表拖拽实现 拖拽的逻辑 xff1a 按住某一个id 拖拽到需要移动的某个后面 如 xff1a 1 2 3 4 5 把 1 放到5的后面 列表改变顺序后变成 2 3 4 5 1 所以目前的代码实现逻辑为 把1 挨
  • CentOS8安装Mysql提示Error: Unable to find a match

    yum y install mysql community server Last metadata expiration check 0 13 40 ago on Sun 26 Apr 2020 11 20 57 AM CST No ma
  • 常见协议的默认端口

    常见协议的默认端口 1 HTTP协议 xff0c 服务器的默认端口号为 xff1a 80 2 HTTPS协议 xff0c 服务器默认的端口号为 xff1a 443 3 Telnet协议 xff0c 服务器默认的端口号为 xff1a 23 4
  • 锐捷交换机基本配置命令

    show ip interface brief 查看当前配置的ip地址 enable password admin 给enable配置密码 switchport trunk allowed vlan all 允许全部vlan通过 xff1f
  • 一道经典的数据库sql语句题目

    SQL查询题目 lt 列表视图页显示缩略图和文章摘要 gt lt 文章视图页显示全部内容 gt lt 如果有内容 xff0c 显示内容 gt SQL查询题目 条件 xff1a Student Sno Sname Sage Ssex 学生表
  • OpenCv+VS2017图像处理入门(一)

    安装VS2017 Visual Studio官网下载社区版VS2017 xff0c 安装教程照着网上做即可 安装OpenCv 官网下载opencv3 3 0 vc14 exe 3 配置OpenCv环境 xff08 1 xff09 计算机环境
  • 模板编程:C++11 可变模版参数的使用(逗号表达式、可变长数组、C#的委托实现)

    转载 xff1a 泛化之美 C 43 43 11可变模版参数的妙用 qicosmos 江南 博客园 cnblogs com 重点 xff1a 1 template lt class T gt 和template lt typenameT g
  • Qt------自定义标题栏(最小化、最大化、关闭、边框拉伸、拖动)

    转载 xff1a Qt之界面 xff08 自定义标题栏 无边框 可移动 缩放 xff09 我不是萧海哇 的博客 CSDN博客 参考了两篇文章处理 xff0c 还有半屏没处理 xff0c 就是左右边框的时候半屏 重点 xff1a 1 拖动需要
  • 服务器多解决方案编译

    服务器上的编译方法可以有多种 xff0c 其中一种方案是采用多解决方案 服务器编译项目采用的是多解决方案并行编译 xff0c 而本地编译是根据依赖顺序进行顺序编译 多解决方案的优点 xff1a 一般来说 xff0c 服务器端的软件较为复杂
  • OCC的模型的拓扑结构描述

    如下图所示 一个构件由两个面构成 拓扑结构的描述如下图所示 xff1a Shape gt 面 gt 线框 gt 边 gt 点
  • AutoCad二次开发原理

    重点 xff1a 1 AutoCad主要是三部分组成 xff1a 数据 建模 渲染 2 二次开发AutoCad在建模方面只提供少量的建模接口 xff0c 其中autocad提供ACIS的shell和mesh接口 xff0c 不够使用 需要单
  • Android Studio新建工程默认在build.gradle中加入maven阿里源

    背景 xff1a 在安卓开发时 xff0c 我们时常会因为gradle Sync时间漫长感到烦恼 通常情况下我们会在build gradle Project MyApplication 中的repositories里添加阿里源 xff0c
  • C语言进阶(六):指针数组字符串函数

    目录 一 指针的本质分析 1 号的意义 xff08 1 xff09 指针的声明和使用 xff08 2 xff09 实践 xff1a 指针使用示例 2 传值调用与传址调用 xff08 1 xff09 什么是传值调用 xff0c 传址调用 xf
  • 单片机核心学习:(六)串口UART编程(STM32F103)

    目录 一 硬件知识 UART硬件介绍 1 串口的硬件介绍 2 串口的参数 xff08 1 xff09 怎么发送一字节数据 xff0c 比如 A xff08 2 xff09 逻辑电压 3 串口电平 4 串口内部结构 二 STM32F103 U
  • TortoiseSVN Client使用说明

    1 TortoiseSVN的安装 当前使用的TortoiseSVN为 xff1a TortoiseSVN 1 14 1 29085 x64 svn 1 14 1 msi xff0c 下载安装地址 xff1a Downloads Tortoi
  • 网易云音乐缓存音乐/视频文件的解密操作

    现在播放器的缓存都会进行一定的操作 用户不能简单的通过修改缓存文件名来获取源音乐 视频文件 一般而言 xff0c 即使找到缓存文件并用播放器打开 xff0c 依然不能正常播放 经过笔者小小的观察 xff0c 发现云音乐的缓存文件加密算法十分
  • Linux 网络开发必学课程(一)网络编程的概念与模式、服务端编程初体验

    1 网络编程的概念与模式 网络编程的本质 使用操作系统提供的接口函数 xff0c 使得应用程序具备收发网络数据 的能力 网络接口在代码层面是操作系统提供的函数 网络编程只是一系列系统函数的花式玩法 应用程序通过网络接口使用操作系统的联网能力