【网络编程基础(一)】网络基础和SOCKET

这里写目录标题

  • 1、网络三要素
  • 2、IPV4和IPV6区别
  • 3、网络交互
    • 3.1、交互模型图
    • 3.2、基础通信协议
    • 3.3、OSI参考模型与TCP/IP参考模型对应关系
  • 4、SOCKET网络套接字
    • 4.1、SOCKET分类
    • 4.2、基于流式套接字的编程流程
    • 4.3、网络通信雏形
    • 4.4、socket函数
      • 4.4.1、socket函数示例
    • 4.5、bind函数
      • 4.5.1、bing函数示例
    • 4.6、listen函数
      • 4.6.1、listen函数示例
    • 4.7、accept函数
    • 4.8、connect函数
  • 5、客户端服务器通信示例
    • 5.1、客户端示例
    • 5.2、服务器示例
    • 5.3、网络通信示图

1、网络三要素

  • ip地址:在网络确定另一个交互数据的计算机位置
  • 端口号:确定计算机中某一个应用程序 10000以下不适用(系统使用,如热点,蓝牙等)
  • 通信协议:通信规则

2、IPV4和IPV6区别

IPv4和IPv6是互联网协议(Internet Protocol)的个版本,它们有以下几点区别:

  1. 地址长度:IPv4使用32位地址,而IPv6使用128位地址。
  2. 地址表示:IPv4地址使用点分十进制表示,例如192.168.0.1。而IPv6地址使用冒号分隔的八组四位十六进制数表示,(数字+字母 大小写排列组合)
    例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。
  3. 地址数量:IPv4最多可以提供约42亿个地址,而IPv6可以提供约340万亿亿亿亿(3.4×10^38)个地址。
  4. 自动配置:IPv6支持自动配置,设备可以根据网络环境自动获取IPv6地址和其他网络配置信息。而IPv4需要手动配置或使用DHCP协议进行地址分配。
  5. 安全性:IPv6在设计时考虑了更强的安全性,支持IPsec(Internet Protocol Security)协议,可以提供端到端的数据加密和认证功能。而IPv4需要额外的安全协议来实现类似的功能。
  6. 兼容性:由于IPv6与IPv4有很大的差异,为了实现平滑过渡,IPv6引入了双协议栈机制,可以同时支持IPv4和IPv6。这样可以保证在IPv6逐渐普及的过程中,与IPv4兼容的设备仍然可以正常访问互联网。

3、网络交互

3.1、交互模型图

在这里插入图片描述

3.2、基础通信协议

在这里插入图片描述
** TCP和UDP区别:**

TCP:更加安全,效率低一些
UDP:效率更高,安全性不足

3.3、OSI参考模型与TCP/IP参考模型对应关系

在这里插入图片描述

应用层 :HTTP,FTP,SNMP等
表示层 :ASCII、PICT、TIFF、JPEG、 MIDI、MPEG
会话层 :RPC、SQL、NFS 、X WINDOWS、ASP
传输层 :TCP、UDP=
网络层 :IP、IPX、APPLETALK、ICMP
数据链路层: 802.2、802.3ATM
物理层

4、SOCKET网络套接字

4.1、SOCKET分类

  • 流式套接字(SOCK_STREAM)
    流式的套接字可以提供可靠的、面向连接的通讯流。它使用了TCP协议。TCP 保证了数据传输的正确性和顺序性。
  • 数据报套接字(SOCK_DGRAM)
    数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。使用数据报协议UDP协议。
  • 原始套接字。
    原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。

4.2、基于流式套接字的编程流程

在这里插入图片描述

4.3、网络通信雏形

在这里插入图片描述

注:socket在IPC技术之一:不同电脑中的两个进程间的通信

4.4、socket函数

在这里插入图片描述

  • 参数1:协议族 (IPV4/IPV6)
  • 参数2:网络类型(TCP/UDP)
  • 参数3:一般为0
  • 返回值:返回新建的网络通道描述符
  • 函数功能:网络初始化,验证当前系统是否可以使用网络

协议族
在这里插入图片描述
网络类型
在这里插入图片描述

4.4.1、socket函数示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <stdio.h>
using namespace std;
int main()
{//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");}return 0;
}

4.5、bind函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:绑定的IP地址和端口号的结构体
参数3:绑定的IP地址和端口号的结构体的大小
函数功能:绑定端口号和IP地址
返回值:成功返回0,失败返回-1

4.5.1、bing函数示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}}return 0;
}

4.6、listen函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:客户端数量
函数功能:监听网络是否有数据过来
返回值:成功返回0,失败返回-1

4.6.1、listen函数示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}//监听网络是否有数据过来if (listen(socketfd, 10) == -1)//10为客户端数量{perror("listen error");return 0;}cout << "服务器网络搭建成功" << endl;}return 0;
}

4.7、accept函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:在上一步操作中已经完成,所以为NULL(绑定IP地址和端口号)
参数3:同上
返回值是表示已连接的套接字描述符

accept 函数由 TCP 服务器调用,用于从已完成连接队列队头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。
参数sockfdsockfd是socket系统调用返回的服务器端socket描述符addr用来返回已连接的对端(客户端)的协议地址

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len=0;int acceptfd=0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}//监听网络是否有数据过来if (listen(socketfd, 10) == -1)//10为客户端数量{perror("listen error");return 0;}cout << "服务器网络搭建成功" << endl;while (1){//等待客户端连接   acceptfd 代表已经连接成功的客户端 acceptfd=accept(socketfd,NULL,NULL);//阻塞函数  cout << "客户端连接成功 acceptfd =" << acceptfd << endl;}}return 0;
}

4.8、connect函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:绑定的IP地址和端口号的结构体
参数3:绑定的IP地址和端口号的结构体的大小

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len=0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;addr.sin_family = AF_INET;//绑定服务器IP地址   表示客户端主动查找服务器IP连接addr.sin_addr.s_addr = inet_addr("192.168.16.229");//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);if(connect(socketfd,(struct sockaddr*)&addr,len)==-1){perror("socket error");return 0;}}return 0;
}

5、客户端服务器通信示例

5.1、客户端示例

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;
int main()
{int res = 0;char buf[100] = { 0 };int len = 0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET, SOCK_STREAM,0);if (socketfd < 0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;addr.sin_family = AF_INET;//绑定服务器IP地址   表示客户端主动查找服务器IP连接addr.sin_addr.s_addr = inet_addr("192.168.13.129");//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);if (connect(socketfd, (struct sockaddr*)&addr, len) == -1){perror("socket error");return 0;}while (1){cin >> buf;res = write(socketfd, buf, sizeof(buf));cout << "res= " << res << endl;}}return 0;
}

5.2、服务器示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
int main()
{char buf[100]={0};pid_t pid =0;int res=0;int len=0;int acceptfd=0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}//监听网络是否有数据过来if (listen(socketfd, 10) == -1)//10为客户端数量{perror("listen error");return 0;}cout << "服务器网络搭建成功" << endl;while (1){//等待客户端连接   acceptfd 代表已经连接成功的客户端 acceptfd=accept(socketfd,NULL,NULL);//阻塞函数  cout << "客户端连接成功 acceptfd =" << acceptfd << endl;pid =fork();if(pid ==0){while(1){res= read(acceptfd,buf,sizeof(buf));cout<<"服务器res="<<res<<"buf = "<<buf<<endl;}}}}return 0;
}

5.3、网络通信示图

在这里插入图片描述

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

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

相关文章

外包干了3天,技术明显进步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

Pyqt5中,QGroupBox组件标题字样(标题和内容样式分开设置)相对于解除继承

Python代码示例&#xff1a; import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGroupBox, QLabelclass MyApp(QWidget):def __init__(self):super().__init__()# 创建一个 QVBoxLayout 实例layout QVBoxLayout()# 创建 QGroupBox 实例self.grou…

从政府工作报告探计算机行业发展——探索计算机行业发展蓝图

目录 前言 一、政策导向与行业发展 &#xff08;一&#xff09;政策导向的影响 &#xff08;二&#xff09;企业如何把握政策机遇推动创新发展 二、技术创新与产业升级 三、数字经济与数字化转型 四、国际合作与竞争态势 五、行业人才培养与科技创新 &#xff08;一&a…

HM2019碰撞安全之假人定位

1、调整假人的位置&#xff08;Tools→Dummy&#xff09; 2、对假人的姿态进行调整 方法一&#xff1a;手动调整 方法二&#xff1a;自动调整 3、假人姿态调整后&#xff0c;还可以对假人目前的姿态保存。 4、将假人恢复到最初状态方法 5、将假人与座椅相关联&#xff08;Tool…

多站合一的音乐搜索下载助手PHP源码l亲测

源码获取方式 回复&#xff1a;031601 搭建教程&#xff1a; 将源码下载上传至宝塔面板&#xff0c;直接运行即可~ 说明&#xff1a; 该源码进行测试&#xff0c;测试成功源码无加密优化相关其他采集问题。

深度强化学习(七)策略梯度

深度强化学习(七)策略梯度 策略学习的目的是通过求解一个优化问题&#xff0c;学出最优策略函数或它的近似函数&#xff08;比如策略网络&#xff09; 一.策略网络 假设动作空间是离散的,&#xff0c;比如 A { 左 , 右 , 上 } \cal A\{左,右,上\} A{左,右,上}&#xff0c;策…

双向SSM: Vision Mamba Encoder

文章目录 Vision Mamba Encoder初始化输入映射序列变换参数映射BC参数映射delta参数映射 SSM参数初始化A , D矩阵初始化delta参数初始化 双向SSM初始化参数初始化 前向输入映射fast_pathuse_fast_pathno use_fast_path 双向SSMv1前向后向 v2前向后向 Vision Mamba Encoder Vis…

Leetcode - 周赛388

目录 一&#xff0c;3074. 重新分装苹果 二&#xff0c;3075. 幸福值最大化的选择方案 三&#xff0c;3076. 数组中的最短非公共子字符串 四&#xff0c;3077. K 个不相交子数组的最大能量值 一&#xff0c;3074. 重新分装苹果 本题是一道阅读理解题&#xff0c;就是将数组a…

THM学习笔记—Simple CTF

nmap扫描&#xff0c;发现2222端口很奇怪啊&#xff0c;重新换一种方式扫描2222端口 发现是ssh 先用ftp试试&#xff0c;尝试匿名登录 下载所有文件 发现只有一个ForMitch.txt&#xff0c;告诉我们其账号密码为弱密码&#xff0c;我们猜测Mitch为其用户名&#xff0c;尝试暴力…

【 c 语言 】指针入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

解密学习机制:线性回归与梯度下降之旅

摘要 在理解机器学习机制的过程中&#xff0c;我们探讨了在合成数据集上训练简单线性回归模型的过程。整个过程要解决的问题是算法如何通过迭代优化来学习输入和输出变量之间的基本关系。 我们的方法包括生成一个合成线性数据集&#xff0c;实施梯度下降进行参数估计&#xf…

SpringBoot打造企业级进销存储系统 第五讲

package com.java1234.repository;import com.java1234.entity.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query;import java.util.List;/*** 菜单Repository接口*/ public interface MenuReposit…