C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
目录
前言
一、网络的含义与构成
含义:
构成:
二、网络的体系结构
1>OSI七层模型
2>TCP/IP协议体系结构
3>数据经过体系结构,怎么封装?
4>端口号
5>大小端序
6>TCP/UDP传输层的协议
三、系统函数API学习框架(TCP)
服务器(优先):
客户端:
四、服务器和客户端代码实例
总结
前言
网络编程是指使用编程语言进行网络通信的过程。通过网络编程,计算机可以通过互联网或局域网与其他计算机进行数据交换和通信。在网络编程中,程序员需要使用特定的网络编程接口和协议(如TCP/IP、HTTP等)来实现数据的发送和接收。网络编程常用于开发网络应用、远程服务和分 布式系统等。
网络编程具有以下几个重要的作用:
-
数据交换和通信:通过网络编程,计算机可以在网络上进行数据的发送和接收,实现信息的交换和通信。这对于实现远程服务、分布式系统以及网络应用等都非常重要。
-
分布式系统:通过网络编程,可以将多台计算机连接起来,形成一个分布式系统。在分布式系统中,不同计算机之间可以互相通信和协作,共享资源和处理任务,从而提高系统的可靠性、性能和扩展性。
-
网络应用开发:网络编程是开发网络应用(如Web应用、聊天室、在线游戏等)的基础。通过网络编程,可以实现服务器端和客户端之间的数据交互,从而实现用户与服务器的交互和信息的展示。
-
网络安全:网络编程也与网络安全密切相关。通过网络编程,可以实现加密、认证、防止信息泄漏等安全机制,保护网络通信的隐私和安全。
总之,网络编程为计算机之间的数据交换和通信提供了技术基础,成为了构建分布式系统、开发网络应用以及保障网络安全的重要手段。
一、网络的含义与构成
含义:
1.什么是网络?
网络是信息传输、接收和共享的虚拟世界,通过把地球村内所有
信息汇聚起来,从而实现这些资源的共享。
初衷:知识共享
构成:
2.计算机上的软件层面的网络是由什么构成?
1>IP
格式:
点分十进制 用户浏览与编写 192.168.10.x
网络二进制 系统、电脑看的 0、1组合
分类:
IPv4 (主要集中,应用在电脑)
点分十进制 4个字节
网络二进制 32位
(42个ip地址)
IPv6 (手机WiFi、目前在电脑中不集中)
点分十进制 16个字节
网络二进制 128位
IPv4分五类
A B C D E
大型网 中大型 中小型 组播型 待用型
(1)A类地址
网络二进制:是以0开头
1个网络地址 3个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
00000000 00000000 00000000 00000001 - 01111111 11111111 11111111 11111110
点分十进制:
0.0.0.1-127.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址
(2) B类地址
网络二进制:是以10开头
2个网络地址 2个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
10000000 00000000 00000000 00000001 - 10111111 11111111 11111111 11111110
点分十进制:
128.0.0.1-191.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址(3)C类地址
网络二进制:是以110开头
3个网络地址 1个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110
点分十进制:
192.0.0.1-223.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址(4)D类地址
网络二进制:是以1110开头
4个网络地址 0个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
11100000 00000000 00000000 00000001 - 11101111 11111111 11111111 11111110
点分十进制:
224.0.0.1-239.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址
(5)E类地址
未来可期2>子网掩码
网络地址全为1,主机全为0
255.255.255.0
用来判断是否在同一网段
前缀长度:24(主要看子网掩码中1的个数)
-->在linux网络配置中有体现
3>默认网关
主机地址默认值为1,随机取1-254,掐头去尾
用来管理当前网段下的信息传输;网络的门户
-->结合图片理解
4>DNS域名解析服务器
按照地方运营商提供的DNS域名服务器
202.98.128.86
www.baidu.com
IP所属地:广东、深圳
二、网络的体系结构
1.OSI七层模型
ISO公司推出的网络体系模型
协议:双方规定好的通信规则
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
目的:将数据封装起来,形成一个约定好的通信协议
缺点:太复杂,太繁琐,有写功能重复
2.TCP/IP协议体系结构
应用层 ftp、http、ping、ssh
传输层 TCP、UDP
网络层 IP、ICMP、IGMP
物理层 网线
重点学习的网络体系结构,网络协议中的世界
3.数据经过体系结构,怎么封装?
封装数据的目的是为了保证数据在网络中传输的稳定性
-->结合图片理解
4.端口号
区分不同的应用程序,针对主机
QQ4999,微信5050
2个字节 0~65535
0~1023 --》系统进程使用的
1024~65535 --》用户用的
5.大小端序
不同类型的CPU的主机中,内存存储的整数字节序有两种
小端序:
低位字节存储到低位地址, linux
大端序:
低位字节存储到高位地址, 系统
6.TCP/UDP传输层的协议
TCP/UDP的区别:
UDP(用户数据报协议)的特点:只管发送,没有连接属性,数据因此不可靠,不稳定,易丢失。
举例:写信
TCP(传输控制协议)的特点:要先建立连接,保证了数据的可靠信,因此数据稳定,不丢包。
举例:带电话
三、系统函数API学习框架(TCP)
服务器(优先):
框架:
1>创建socket套接字
2>绑定自己的IP地址和端口号
3>监听
4>等待客户端连接
5>数据收/发
6>关闭套接字(具有网路属性的文件描述符)
1.创建socket套接字 (socket)
头文件:
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
功能:
创建一个具有网络属性的文件描述符
参数:
domain:协议族
AF_UNIX,AF_LOCAL 本地连接
AF_INET IPv4
AF_INET6 IPv6
type:
SOCK_STREAM 流式套接字 TCP
SOCK_DGRAM 数据报套接字 UDP
SOCK_RAW 原始套接字
protocol:
默认为0,表示前面两个所选参数生效
返回值:
成功返回具有网络属性的文件描述符
失败,返回-1并设置错误码
socket位于哪里,位于应用层和传输层之间
2.绑定自己的IP地址和端口号(bind)
头文件:
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
功能:
将IP地址和端口号绑定在sockfd上,难点在于第二参结构体赋值
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
my_addr:结构体指针,用来赋值IP地址和端口号
addrlen:结构体的长度
返回值:
成功返回0
失败,返回-1并设置错误码
第二参数const struct sockaddr *my_addr
struct sockaddr {
sa_family_t sa_family; 2个字节
char sa_data[14]; 14个字节
}
问题:
赋值时IP地址和端口号哪个在前哪个在后不确定
IP地址和端口号只占据6个字节,还有8个字节怎么填充
因此选用同族结构体
struct sockaddr_in{
sa_family_t sin_family; //地址族
uint16_t sin_port; //端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; //预留未使用,自动填充0
};
struct in_addr{
In_addr_t s_addr; //32位IPv4地址
};1>注意端口大小端序转换的问题
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); 32位
uint16_t htons(uint16_t hostshort); 16位
以上小端序转大端序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
大端序转回小端序2>注意IP格式转换
#include <netinet/in.h>
in_addr_t inet_addr(const char *cp);
将点分十进制的IP地址转换为网络二进制
char *inet_ntoa(struct in_addr in);
将网络二进制转回点分十进制
3.监听 (listen)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
保护服务器,限制同一瞬间最大的客户端连接数量
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
backlog:最大的客户端连接数量
返回值:
成功返回0
失败,返回-1并设置错误码
4.等待客户端连接 (等待意味着“阻塞” accept)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
等待客户端连接,第二参能保存对方的IP地址和端口号,不需要保存对方设置NULL
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
addr:用来保存客户端信息的结构体
addrlen:结构体长度。
返回值:
成功返回与客户端通信的文件描述符,与socket函数类似
失败,返回-1并设置错误码
客户端:
为了演示效果明显,我们开始写客户端框架
1>创建socket套接字
2>声明服务器所在的IP地址和端口号
3>主动连接服务器
4>数据收/发
5>关闭文件描述符
1.创建socket套接字与服务器相似
2.声明服务器所在的IP地址和端口号
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = inet_addr("192.168.10.5");
注意声明都是别人的,与你无关
3.主动连接服务器 (connect)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
功能:
主动连接服务器,第二参能保存对方的IP地址和端口号,不需要设置NULL
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
addr:用来连接服务器的结构体
addrlen:结构体长度,一般用sizeof()。
返回值:
成功返回0
失败,返回-1并设置错误码
4.数据发送(send)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
数据发送
参数:
sockfd:套接字文件描述符
buf:发送缓冲区
len:发送缓冲区长度
flags:默认为0,表示阻塞
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
5.数据接收(recv)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd,void *buf, size_t len, int flags);
功能:
数据接收
参数:
sockfd:套接字文件描述符
buf:接收缓冲区
len:接收缓冲区长度
flags:默认为0,表示阻塞
返回值:
>0: 返回接收的字节数
=0: 客户端异常退出(CTRL+C)
<0: 失败:返回-1,并设置errno
四、服务器和客户端代码实例
//服务器代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int main(void)
{//1>创建socket套接字int serfd = socket(AF_INET,SOCK_STREAM,0);//1.选IPv4,2选TCP,3默认0if(serfd<0) //错误判断{perror("socket");return -1;}printf("创建出的socket的值为%d\n",serfd);//2>绑定自己的IP地址和端口号struct sockaddr_in my_addr;my_addr.sin_family = AF_INET;//IPv4my_addr.sin_port = htons(8888);//将linux小端转系统的大端my_addr.sin_addr.s_addr =inet_addr("192.168.10.5");//注意将IP地址格式转为网络二进制,还有记得改成自己的linuxIP地址int ret;ret = bind(serfd,(struct sockaddr *)&my_addr,sizeof(my_addr));//第二参将同族结构体强转为函数需要的结构体类型if(ret<0) //错误判断{perror("bind");return -1;}printf("serfd网络属性已成功配置!\n");//3>监听ret = listen(serfd,8);if(ret<0) //错误判断{perror("listen");return -1;}printf("监听已启动,保护服务器中^-^\n");//4>等待客户端连接 阻塞int clifd = accept(serfd,NULL,NULL);//accept接触阻塞后将产生一个与客户端通信的文件描述符if(clifd<0) //错误判断{perror("accept");return -1;}printf("创建出与客户端通信的文件描述符值为%d\n",clifd);printf("有客户连接进来了!\n");//5>数据的接收char buf[30];while(1){
#if 0bzero(buf,sizeof(buf));ret = recv(clifd,buf,sizeof(buf),0);//阻塞printf("客户端说:%s\n",buf);
#endifbzero(buf,sizeof(buf));ret = recv(clifd,buf,sizeof(buf),0);//阻塞if(ret<0){perror("recv");return -1;}else if(ret == 0){printf("客户带着小姨子跑了!\n");return -1;}else{printf("客户端说:%s\n",buf);}}//6>关闭套接字close(serfd);close(clifd);return 0;
}
//客户端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int main(void)
{//1>创建socket套接字int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket");return -1;}printf("创建出的socket的值为%d\n",sockfd);//2>声明"服务器"所在的IP地址和端口号struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(8888);server.sin_addr.s_addr = inet_addr("192.168.10.5");printf("已经声明服务器的IP地址和端口号!\n");//3>主动连接服务器int ret = connect(sockfd,(struct sockaddr*)&server,sizeof(server));if(ret<0){perror("connect");return -1;}printf("连接服务器成功,请进行操作!\n");//4>数据发送char buf[30];while(1){bzero(buf,sizeof(buf));scanf("%s",buf);send(sockfd,buf,strlen(buf),0); }//5>关闭文件描述符close(sockfd);return 0;
}
总结
本篇文章针对C/C++ 网络编程进行详细讲解,希望能够帮到大家!
以后还会给大家展现更多关于嵌入式和C语言的其他重要的基础知识,感谢大家支持懒大王!
希望这篇博客能给各位朋友们带来帮助,最后懒大王请来过的朋友们留下你们宝贵的三连以及关注,感谢你们!
相关文章:
C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
目录 前言 一、网络的含义与构成 含义: 构成: 二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构 3>数据经过体系结构,怎么封装? 4>端口号 5>大小端序 6>TCP/UDP传输层的协议 三、系统函数API学习框…...
chrome Driver 使用教程
ChromeDriver是一款实用的chrome浏览器驱动工具,能够用于自动化测试、网络爬虫和操作浏览器,其主要作用是模拟浏览器操作。 ## 下载地址 [Chrome for Testing availability](Chrome for Testing availability)...
目标检测YOLO实战应用案例100讲-面向恶劣环境下的多模态 行人识别
目录 前言 国内外研究现状 可见光行人目标识别 红外行人目标识别...
react-router-dom v6版本实现Tabs路由缓存切换
目录 文章目录 概要 效果 完整代码 概要 摆了半年摊,好久没写代码了,今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大,但了解react的机制和rea…...
ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?
本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件,拖到ArcGIS后却出现“未知的空间参考:添加的数据源缺少空间参考信息 不能投影”的提示,如下图所示: 这种情况就…...
Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎,它还提供了分布式的多用户能力,实时的分析,以及对复杂搜索语句的处理能力,使其在众多场景下,如企业搜索,日志和事件数据分析等…...
离线语音与IoT结合:智能家居发展新增长点
离线语音控制和物联网(IoT)相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理,而不需要依赖云服务器进行处理。IoT是指借助网络,通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…...
STM32MP135和STM32MP157的区别
本文介绍了STMicroelectronics公司推出的两款多核处理器STM32MP135和STM32MP157之间的区别,包括主频、集成硬件模块数量、内存大小和电压调节模块等方面。 STMicroelectronics是一家领先的半导体解决方案提供商,在嵌入式系统领域有着丰富的经验。他们…...
微信小程序文本横向无缝滚动
背景: 微信小程序中列表宽度不够长,其中某字段显示不完整,因此要使其自动滚动。 (最初看网上很多用定时器实现,但他们的案例中都只是一个横幅、用定时器也无所谓。但是我的需求中是一个上下无限滚动的列表,…...
Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值
var iframeWindow window[layui-layer-iframe index]; iframeWindow.layui.tree............(这里就可以操作tree里面的内容了)。var chrild layero.find(iframe).contents(); chrild.layui.tree (这样是调用不到的)。var child layer.getChildFrame(); child.layui.tree(这…...
镜头边缘的解析力通常比中心差很多的原因是什么?
1、问题背景 之前有总结过一篇文章,“ 相机出图画面一半清晰,一半模糊的原因是什么?”里面有描述到关于镜头边缘的清晰度通常比中心要差的原因主要是光的折射导致的,有读者指出问题,折射率是和传输介质相关࿰…...
“控制情绪,理性交流”刍议
今天,本“人民体验官”还是回避推广人民日报官方微博文化产品《走出低谷期的9个习惯》。 截图:来源“人民体验官”推广平台 之前,由于笔者读过《人民日报》曾经发表过的关于“学会管理情绪 ”的文章,对文章中这些观点深表认同&…...
UI基础之插画分类优漫动游
一、UI插画分类 UI基础之插画分类 1.扁平插画 优点∶快速上手,同时画风简洁明了,突出重 点,能够快速的让用户了解内容 缺点:过于简洁,运用的也比较普遍,视觉上难以让用户记住 2.肌理插…...
Vue 3.0中Treeshaking特性是什么?
一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code elimination 简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码 如果把代码打包比作制作蛋糕,传统的方式是把鸡…...
SQL union all的使用
背景: 公司业务开发需要将两个取出两个相同表结构(原料、辅料)的数据,组成一个新视图,使用了UNION ALL SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GOCREATE view vw_rawmaterial_ny_list as ( select id,ccode,cc…...
docker 安装 Centos7
1. 从docker 安装 Centos7 查看有哪些 centos7 系统:docker search centos72. 安装 centos7 docker pull docker.io/ansible/centos7-ansible3.使用镜像创建容器 docker run -itd -p 8022:22 --namevm01 -v /bodata:/bodata -h vm01 --privilegedtrue 688353a31…...
Kubernetes技术与架构-Ingress
Ingress是一个流量网关,其根据配置的URI路径路由规则,为运行在Kubernetes集群中的Service分发流量,从系统架构设计的角度看,Ingress位于Service的上层,本文主要描述Ingress的基本使用方式。 如上所示,clien…...
基于Java的文物管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
uniapp图片加水印
1、uniapp加水印 1.1、创建画布容器 <canvas class"watermark-canvas" id"watermark-canvas" canvas-id"watermark-canvas":style"{ width: canvasWidth, height: canvasHeight }" /> 1.2、获取水印内容 async getLocation(…...
react中JSX基础与useState的基本使用 + 评论显示删除需求案例
参考视频:https://www.bilibili.com/video/BV1ZB4y1Z7o8/?p3&spm_id_frompageDriver&vd_source5c584bd3b474d579d0bbbffdf0437c70 如果没有安装create-react-app需要先全局安装 命令:npm i -g create-react-app1.快速搭建开发环境 create-re…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...
Linux中INADDR_ANY详解
在Linux网络编程中,INADDR_ANY 是一个特殊的IPv4地址常量(定义在 <netinet/in.h> 头文件中),用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法,允许套接字监听所有本地IP地址上的连接请求。 关…...
