TCP/IP 网络编程(一):基础知识

2023-10-27

声明:本系列文章参考书:《TCPIP网络编程 》[韩] 尹圣雨 

本人仅作笔记使用

目录

一、网络编程和套接字

二、Linux文件操作

文件描述符

打开文件

关闭文件

将数据写入文件

读取文件中的数据

三、套接字类型与协议设置

协议:计算机间对话需遵守的通信规则

创建套接字

协议族

套接字类型1:面向连接(SOCK_STREAM)

套接字类型2:面向消息(SOCK_DGRAM)

四、地址族和数据序列

IPV4的地址族ABCDE类型:

端口号:区分套接字(应用程序)

表示IPv4地址的结构体

网络字节序与地址变换

IP字符串转换为整数型

网络字节序整数型IP转换为字符串


一、网络编程和套接字

网络编程:编写程序使得两台联网的计算机相互交换数据。

套接字:操作系统提供的软件设备,用来连接网络的工具。

直观理解:

socket:电话机

bind:分配电话号码(IP地址和端口号)

listen:连接电话线,等待来电

accpet:接电话,拿起话筒

服务端的套接字创建过程:

  • 调用socket创建套接字
  • 调用bind分配IP地址和端口好
  • 调用listen转为可接受请求状态
  • 调用accept受理连接请求
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);
int listen(int sockfd,int backlog);
int accept(int sockfd,struct sockaddr*,socklen_T *addrlen);
//成功返回0,失败返回-1

客户端的套接字创建过程:

  • 调用socket创建套接字
  • 调用connect向服务器发送连接请求
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr* serv_addr,socklen_t addrlen);
//成功返回0,失败返回-1

二、Linux文件操作

文件描述符

文件句柄。但句柄主要是Windows中的术语,Linux主要叫描述符。每当生成文件或套接字,操作系统将返回分配给它们的整数。这个整数将成为程序员与操作系统之间良好沟通的渠道。实际上,文件描述符只不过是为了方便称呼操作系统创建的文件或套接字而赋予的数而已。

直白理解:论文号相当于文件描述符论文相当于文件或套接字

打开文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *path, int flag);

path:文件名的字符串地址

flag:文件打开模式信息,若传递多个参数通过或运算(|)组合

关闭文件

#include <unistd.h>
int close(int fd);

fd:需要关闭的文件或套接字的文件描述符

Linux操作系统不区分与套接字,此函数不仅可以关闭文件,也可以关闭套接字

将数据写入文件

向文件输出(传输)数据。

#include <unistd.h>
ssize_t write(int fd, const void* buf, size_t nbytes);

fd:数据传输对象的文件描述符

buf:要传输数据的缓冲地址值

nbytes:传输数据的字节数

(注:size_t为unsigned int类型,ssize_t为signed,同时操作系统为了与程序员的代码区分加了后缀_t)

读取文件中的数据

输入(接受)数据

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);

fd:数据接收对象文件描述符

buf:接收数据缓冲地址值

nbytes:接收数据最大字节数

三、套接字类型与协议设置

协议:计算机间对话需遵守的通信规则

创建套接字

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

domain:套接字中使用的协议族

type:套接字数据类型

protocol:使用的协议

协议族

套接字类型1:面向连接(SOCK_STREAM)

特点:

  • 传输过程中数据不会丢失
  • 按序传输
  • 传输的数据不存在数据边界
  • 套接字必须一一对应

总结:可靠的按序传递的基于字节的面向连接的数据传输方式的套接字。

100个糖果是分批传递的,但接收者凑齐100个后才装袋

也就是说接受和发送的套接字内部有缓冲,简言之字节数组,通过传输的数据保存在该数组。

因此收到数据并不意味着马上调用read函数。

有可能装满缓冲后调用1次read。

接受缓冲满了,发送端将停止传输。

int tcp_socket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

套接字类型2:面向消息(SOCK_DGRAM)

特点:

  • 强调快速传输而非传输顺序
  • 传输的数据可能丢失也可能损毁
  • 传输的数据有数据边界
  • 限制每次传输的数据大小

总结:不可靠的不按序传递的以数据的高速传输为目的的套接字。

int udp_socket = socket(PF_INET,SOCK_DGRAM,IPPROTE_UDP);

四、地址族和数据序列

网络地址:

  • IPV4:4字节地址族
  • IPV6:16字节地址族

IPV4的地址族ABCDE类型:

  • A类地址首字节范围:0-127(首位从0开始)
  • B类地址首字节范围:128-191(首位从10开始)
  • C类地址首字节范围:192-223(首位从110开始)

端口号:区分套接字(应用程序)

  • NIC(Network Interface Card,网卡)
  • 端口号不能重复,但TCP和UDP可以使用同一个端口

表示IPv4地址的结构体

struct sockaddr_in{
    sa_family_t     sin_family;  //地址族
    uint16_t        sin_port;    //16位TCP/UDP端口号
    struct in_addr  sin_addr;    //32位IP地址
    char            sin_zero[8]; //不适用
};

struct in_addr{
    In_addr_t     s_addr;//32位IPv4地址
};

初始化:

struct sockaddr_in addr;
char *serv_ip = "211.217.168.13";
char *serv_port = "9190";
memset(&addr, 0 ,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(serv_ip);
addr.sin_port = htons(atoi(serv_port));

POSIX(Portable Operating System Interface,可以指操作系统接口),为UNIX系列操作系统设立的标准。

网络字节序与地址变换

大端序:

小端序:

网络字节序统一为大端序。

字节序转换:

unsigned short htons (unsigned short);
unsigned short ntohs (unsigned short);
unsigned long  htonl (unsigned long);
unsigned long  ntohl (unsigned long);

h代表主机(host)字节序,n代表网络(network)字节序 

IP字符串转换为整数型

#include <apra/inet.h>
in_addr_t inet_addr(const char *string);
//成功返回32位大端序整数值,失败返回INADDR_NONE
#include <arpa/inet.h>
int inet_aton(const char* string, struct in_addr *addr);

网络字节序整数型IP转换为字符串

#include <arpa/inet.h>
char *inet_ntoa(struct in_addr adr);

 注意,该函数返回字符串地址意味着字符串已保存到内存空间,但并未向程序员要求分配内存,而是在内部申请内存并保存了字符串。

也就是说,调用完该函数,需要立即字符串复制到其他内存空间。

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

TCP/IP 网络编程(一):基础知识 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • XAMPP Windows 上的 Php Cron 作业

    嗯 我是这个词的新手CRON 据我所知 这是一个Unix安排特定操作在定义的时间间隔后执行的概念 我需要运行一个php文件 每小时更新一次数据库 但我的困惑在于安排执行 我在用XAMPP用于 Windows 7 上的本地开发测试 我发现了什
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 了解 Linux oom-killer 日志

    我的应用程序被 oom killer 杀死了 它是在实时 USB 上运行的 Ubuntu 11 10 无需交换 PC 具有 1 Gig 的 RAM 唯一运行的应用程序 除了所有内置的 Ubuntu 东西 是我的程序 flasherav 请注
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称

随机推荐

  • 安装potobuf(make check通过)

    很多文章中给出的方法是在github上下载项目 然后创建build再安装googletest 但是在最后的make check时一直报错 如果是python中使用 直接sudo pip3 install i https pypi tuna
  • Spring 3整合Quartz 2实现定时任务一:常规整合

    最近工作中需要用到定时任务的功能 虽然Spring3也自带了一个轻量级的定时任务实现 但感觉不够灵活 功能也不够强大 在考虑之后 决定整合更为专业的Quartz来实现定时任务功能 首先 当然是添加依赖的jar文件 我的项目是maven管理的
  • Cannot run program “D:\Environment\jdk1.8\bin\java.exe”解决方法

    Cannot run program D Environment jdk1 8 bin java exe in directory D Project Java Idea project docker springboot CreatePr
  • Scratch的广播与消息

    在事件积木中 有一块触发积木叫当接收到 消息1 对应地 有两块积木 广播 消息1 广播 消息1 并等待 广播 消息机制就是编程中的全局事件 当一个消息被广播时 所有角色 包含广播者自身 都会接收到该消息 只要一个角色有该消息的接收脚本 即可
  • 【Linux】进程程序替换 &&简易mini_shell实现

    文章目录 替换原理 替换函数 替换函数的使用 简易shell实现程序 替换原理 目前 我们使用fork创建子进程 为了用if else让子进程执行父进程代码的一部分 如果想让子进程执行一个全新的程序 进程不变 仅仅替换当前进程的代码和数据
  • python怎么自学

    其实0基础选择python学习入行的不在少数 Python近段时间一直涨势迅猛 在各大编程排行榜中崭露头角 得益于它多功能性和简单易上手的特性 让它可以在很多不同的工作中发挥重大作用 正因如此 目前几乎所有大中型互联网企业都在使用 Pyth
  • 图像识别(九)

    大家好啊 我是董董灿 很多同学在做深度学习时 都会遇到难以理解的算法 SoftMax肯定是其中一个 初学者大都对它一知半解 只知道SoftMax可以用来做分类 输出属于某个类别的概率 但是 为什么要用SoftMax呢 这个算法又是如何将神经
  • javascript原型、原型链、继承详解

    一 原型和原型链的基本概念 在JavaScript中 每个对象都有一个原型对象 prototype 原型对象就是一个普通的对象 在创建新对象时 可以将该对象作为新对象的原型 原型对象可以包含共享的属性和方法 这些属性和方法可以被新对象继承和
  • ajax异步加载和cmd,异步传输Ajax(JQ)

    异步传输Ajax JQ JSP 服务器 Stringstr name a 张三 a 李四 age 18 resp getWriter write str 客户端 function button eq 0 click function aja
  • 基于组合优化的3D家居布局生成看千禧七大数学难题之NP问题

    本文探讨了运筹学和组合优化方法在3D家居布局生成中的应用 并调研了AI生成3D场景布局的最新方法 文中结合了家居家装业务的实际应用场景 从算法建模和计算复杂度的角度上阐述了室内设计的布局问题中存在的难点 以及如何用简化和近似的思想来建模3D
  • PhpStorm PHP代码注释自动插入设置

    设置路径 PhpStorm gt Prererences gt File and Code Templates 如下图 PHP 类注释 PHP Class Doc Comment CARET package NAMESPACE class
  • go使用mongodb

    何为MongoDB 简介 MongoDB 是由C 语言编写的 是一个基于分布式文件存储的开源数据库系统 在高负载的情况下 添加更多的节点 可以保证服务器性能 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案 MongoDB
  • python文档处理脚本 github_使用 Python3 编写 Github 自动周报生成器

    简介 都说好东西要分享出去 但这个项目例外 我们将教你使用 PyGithub 自动生成周报 千万不要让人知道你学了这个项目 否则你将承包全公司人的周报 每个程序员都有一个痛 那就是周报 每次写周报的时候 都感觉身体被掏空 我这周TM都干了什
  • C++一定要为类提供拷贝构造函数的情况

    在C 类中存在成员指针并且在类中为该指针动态申请内存 且该类的对象可能作为函数的形参时 是一定要提供拷贝构造函数的 防止前拷贝直接将该指针拷贝走 test cpp 定义控制台应用程序的入口点 include stdafx h include
  • 测试CUDA的samples

    测试CUDA的samples 1 cd usr local cuda 8 0 samples 1 Utilities deviceQuery 2 sudo make 3 sudo deviceQuery
  • 【从零开始学习深度学习】41. 算法优化之RMSProp算法【基于AdaGrad算法的改进】介绍及其Pytorch实现

    上一篇文章AdaGrad算法中提到 因为调整学习率时分母上的变量 s t boldsymbol s t st 一直在累加按元素平方的小批量随机梯度 所以目标函数自变量每个元素的学习率在迭代过程中一直在降低 或不变 因此 当学习率在迭代早期降
  • python关于onnx模型的一些基本操作

    onnx的基本操作 一 onnx的配置环境 二 获取onnx模型的输出层 三 获取中节点输出数据 四 onnx前向InferenceSession的使用 1 创建实例 源码分析 2 模型推理run 源码分析 五 遇到的一些问题 最近在对模型
  • 如何用Socket和Wsgiref实现一个Web服务器

    目录 1 用Socket实现一个简单的web服务器 2 用Wsgi实现一个简单的web服务器 3 用Wsgi实现支持多url的web服务器 三 用Wsgi实现支持多url和图片的web服务器 1 用Socket实现一个简单的web服务器 首
  • Python爬虫入门续(3):获取2022年10月CSDN文章版本格式的评论数

    一 引言 好久没上CSDN备份及获取文章数据 今天用原有的代码进行CSDN自己博文数据的备份 获取文章点赞数 评论数 阅读数等数据时 发现程序报错 经过仔细分析 发现是CSDN的评论数据展示格式发生了变化 二 报文格式变化对比 原来的CSD
  • TCP/IP 网络编程(一):基础知识

    声明 本系列文章参考书 TCPIP网络编程 韩 尹圣雨 本人仅作笔记使用 目录 一 网络编程和套接字 二 Linux文件操作 文件描述符 打开文件 关闭文件 将数据写入文件 读取文件中的数据 三 套接字类型与协议设置 协议 计算机间对话需遵