网络编程TCP与UDP

TCP与UDP

UDP头: 

包括源端口、目的地端口、用户数据包长度,检验和  数据。

typedef struct _UDP_HEADER 
{unsigned short m_usSourPort;       // 源端口号16bitunsigned short m_usDestPort;       // 目的端口号16bitunsigned short m_usLength;        // 数据包长度16bitunsigned short m_usCheckSum;      // 校验和16bit
}__attribute__((packed))UDP_HEADER, *PUDP_HEADER;

IP头:

UDP与TCP的区别

TCPUDP
有链接无链接
可靠传输(使用流量控制和拥塞控制)不可靠传输(不使用流量控制和用三个控制)
只能一对一一对一,一对多或者多对多
面向字节流面向报文
首部大小20~60字节首部大小8字节

SOCK_UDP

服务端代码:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}// man 7 ip struct sockaddr_in ser,cli;bzero(&ser,sizeof(ser));bzero(&cli,sizeof(cli));ser.sin_family = AF_INET;// 大小端转化 host to net short ser.sin_port = htons(50000);ser.sin_addr.s_addr = inet_addr("192.168.203.128");int ret = bind(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}socklen_t len = sizeof(cli);while(1){char buf[512]={0};recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);time_t tm;time(&tm);sprintf(buf,"%s %s",buf,ctime(&tm));sendto(sockfd,buf,strlen(buf),0,(SA)&cli,len);}close(sockfd);return 0;
}

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser;bzero(&ser,sizeof(ser));ser.sin_family = AF_INET;// 大小端转化 host to net short ser.sin_port = htons(50000);ser.sin_addr.s_addr = inet_addr("192.168.203.128");while(1){char buf[512]="hello,this is udp test";sendto(sockfd,buf,strlen(buf),0,(SA)&ser,sizeof(ser));bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);printf("buf is %s\n",buf);sleep(1);}close(sockfd);return 0;
}

网络接口

socket

int socket(int domain, int type , int protocol);

socket作用:创建套接字。

domain: 协议族---> 指定了套接字所使用的协议类型(常用的协议族包括 AF_INET、AF_INET6、AF_UNIX等。其中,AF_INET 表示 IPv4 协议族,AF_INET6 表示 IPv6 协议族,AF_UNIX 表示 Unix 域协议族)

type:套接字类型---> 指定了套接字的数据传输方式(SOCK_STREAM 表示面向连接的流套接字,主要用于可靠传输数据,例如 TCP 协议。SOCK_DGRAM 表示无连接的数据报套接字,主要用于不可靠传输数据,例如 UDP 协议。)

protocol:协议类型--->指定了套接字所使用的具体的协议类型

bind

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

bind作用:绑定套接字,将套接字与网络地址绑7定。

sockfd:为套接字描述符。

addr 表示绑定的地址信息。

addrlen 是绑定地址信息的长度。

sendto

发送数据(会阻塞)

int sendto (int s, const void *buf, int len, unsigned int flags, const struct sockaddr *to, int tolen);

sendto作用:把UDP数据包发给指定地址。

s:              socket套接字描述符。
buf:         UDP数据报缓存地址。(把数据放在哪里存储,或者说发送的数据是什么)
len:          UDP数据报长度。(发送长度)
flags:       该参数一般为0。
to:            sendto()函数参数,struct sockaddr_in类型,指明UDP数据发往哪里报。
tolen:      对方地址长度,一般为:sizeof(struct sockaddr_in)。

recvfrom

接收数据(不会阻塞)

int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

recvfrom()作用:从指定地址接收UDP数据报。

s:              socket套接字描述符。

buf:         UDP数据报缓存地址。(把数据放在哪里存储,或者说发送的数据是什么)

len:          UDP数据报长度。(接收长度)

fromlen:recvfrom()函数参数,struct sockaddr_in类型,指明从哪里接收UDP数据报。

struct sockaddr_in结构体

struct sockaddr_in {
short int sin_family;                      /* Address family */
unsigned short int sin_port;       /* Port number */
struct in_addr sin_addr;              /* Internet address */
unsigned char sin_zero[8];         /* Same size as struct sockaddr */
};

这个结构体里面包括:
sin_family  //代表协议族  在socket只指AF_INET

sin_port     //存储端口号

sin_addr    //存储IP地址

sin_zero    //是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

listen监听套接字

int listen(int sockfd, int backlog);

功能: 在套接字id上监听等待链接

返回值:成功  0     ;     失败     -1

SOCK_TCP

服务端代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <time.h>
typedef struct sockaddr* (SA);
int main(int argc, char *argv[])
{//监听套接字int listfd =  socket(AF_INET,SOCK_STREAM, 0);if(-1 == listfd){perror("socket");exit(1);}struct sockaddr_in ser,cli;bzero(&ser,sizeof(ser));bzero(&cli,sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);//host to net long ser.sin_addr.s_addr = htonl(INADDR_ANY);int ret = bind(listfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}//同一时刻三次握手排队数listen(listfd,3);socklen_t  len = sizeof(cli);//通信套接字 int conn = accept(listfd,(SA)&cli,&len);if(-1 == conn){perror("accept");exit(1);}while(1){char buf[512]={0};int rd_ret = recv(conn,buf,sizeof(buf),0);if(rd_ret<=0){// 0  对方断开连接 -1 错误break;}time_t tm;time(&tm);sprintf(buf,"%s %s",buf,ctime(&tm));send(conn,buf,strlen(buf),0);}close(listfd);close(conn);return 0;
}

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <time.h>
#include <arpa/inet.h>
typedef struct sockaddr* (SA);int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser;bzero(&ser,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port = htons(50000);//host to net long ser.sin_addr.s_addr = inet_addr("127.0.0.1");int ret = connect(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("connect");exit(1);}while(1){char buf[512]="hello,this is tcp test";send(sockfd,buf,strlen(buf),0);bzero(buf,sizeof(buf));recv(sockfd,buf,sizeof(buf),0);printf("buf :%s\n",buf);sleep(1);}close(sockfd);return 0;
}

三次握手和四次挥手

TCP建立连接://三次握手

最开始客户端处于closed状态,服务端处于Listen状态。

        第一次握手:客户端发送一个SYN主动打开传输通道,并且说明客户端的初始化序列号ISN,这时客户端处于SYN_SENT状态。

        第二次握手:服务器收到客户端发送的SYN报文之后,会用自己的SYN报文作为应答,也指定了自己的初始化序列号ISN(s),同时还会发送ACK应答给客户端,(ACK = ISN + 1),表示自己收到了客户端的SYN,服务端处于SYN_RCVD状态。

        第三次握手:客户端收到SYN报文之后,会发送一个ACK报文,把服务器的ISN+1作为应答ACK的值,表示接收到了服务端的SYN,此时客户端和服务端都处于ESTABLISHED状态。此时建立起了连接。

三次握手目的

确保客户端和服务端的收发功能都是正常的。

TCP终止连接://四次挥手

客户端和服务端都可以主动发起挥手动作,若客户端先发送关闭请求,则过程如下:

        第一次挥手:客户端发送一个FIN报文,报文指定一个序列号,客户端变成FIN——WAIT1的状态。

        第二次挥手:服务端收到FIN之后,给客户端发送ACK报文,把客户端的序列号+1作为ACK回复,此时服务端进入CLOSE_WAIT状态。

        第三次挥手:服务端也要断开连接时,发送FIN报文+序列号给客户端,此时服务端进入LAST_ACK状态。

        第四次挥手: 服务端收到FIN之后发送ACK =  seq+1回复应答,此时客户端处于TIME_WAIT状态,等一段时间确保服务端收到自己的ACK报文之后才会进入CLOSED状态,而服务端收到应答之后直接进入CLOSED状态。

四次挥手目的

        保证客户端发送的最后一个ACK报文能到达服务端。确保所有的信息都传输完,最后发送结束信号,通知对方信息已经发完了再结束。

查看网络指令(在ubuntu)

1、ifconfig    查看自己的网络配置

2、netstat    -anp       查看当前活动的互联网连接

3、ping   测试网络命令

4、sudo ufw disable/enable             //防火墙关闭/打开

5、sudo apt-get install wireshark    //网络抓包工具   只有网络设备闭上有数据的收发就会放在这。

6、sudo wireshark     //使用抓包工具

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

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

相关文章

Docker!!!

⼀、Docker 1、Docker介绍.pdf 1、Docker 是什么&#xff1f; Docker 是⼀个开源的应⽤容器引擎&#xff0c;可以实现虚拟化&#xff0c;完全采⽤“沙盒”机制&#xff0c;容器之间不会存在任何接⼝。Docker 通过 Linux Container&#xff08;容器&#xff09;技术将任意类型…

Ubuntu 安装 mysql 与 远程连接配置

1、安装 mysql ubuntu 默认安装 8.0 版本&#xff1a; sudo apt install mysql-server安装过程中 提示 是否继续操作 y 即可 2、使用ubuntu 系统用户 root 直接进入 mysql 切换至 系统用户 su root 输入命令 可直接进入 mysql: mysql3、创建一个允许远程登录的用户 创建 …

《Python编程:从入门到实践》笔记(一)

一、字符串 1.修改字符串大小写 title()以首字母大写的方式显示每个单词&#xff0c;即将每个单词的首字母都改为大写&#xff0c;其他的改为小写。 upper()将字母都改为大写&#xff0c;lower()将字母都改为小写。 2.合并(拼接)字符串 Python使用加号()来合并字符串。这种合…

超容易出成果的方向:多模态医学图像处理!

哈喽朋友们&#xff0c;今天给大家推荐一个比较容易出成果的方向&#xff1a;多模态医学图像处理。 众所周知&#xff0c;多模态如今火的一塌糊涂&#xff0c;早就成了很多应用科学与AI结合的重要赛道&#xff0c;特别是在医学图像处理领域。 由此提出的多模态医学图像处理融合…

「Java 项目详解」API 文档搜索引擎(万字长文)

目录 运行效果 一、项目介绍 一&#xff09;需求介绍 二&#xff09;功能介绍 三&#xff09;实现思路 四&#xff09;项目目标 二、前期准备 一&#xff09;了解正排索引 二&#xff09;了解倒排索引 三&#xff09;获取 Java API 开发文档 四&#xff09;了解分词…

二叉树检验:算法详解

问题描述 /** 检查二叉树是否为有效的二叉搜索树有效的二叉搜索树满足左子树的节点值都小于根节点值&#xff0c;右子树的节点值都大于根节点值并且左右子树也必须是有效的二叉搜索树param root 二叉树的根节点return 如果二叉树是有效的二叉搜索树&#xff0c;则返回true&…

火绒使用详解 为什么选择火绒?使用了自定义规则及其高级功能的火绒,为什么能吊打卡巴斯基,360,瑞星,惠普联想戴尔的电脑管家等?

目录 前言 必看 为什么选择火绒&#xff1f; 使用了自定义规则及其高级功能的火绒&#xff0c;为什么能吊打卡巴斯基&#xff0c;360&#xff0c;瑞星&#xff0c;惠普联想戴尔的电脑管家等&#xff1f; 原因如下&#xff1a; 火绒的主要优势 1. 轻量化设计 2. 强大的自…

Prism-学习笔记1-安装Prism

安装Prism 在VS2022中安装如下图&#xff1a; 2. 搜索Prism&#xff0c;安装Prism&#xff1a;&#xff08;ps&#xff1a;如果安装很慢&#xff0c;直接往上搜关键字 Prism template Pack 下载&#xff0c;或者这里我下载好的Prism包&#xff0c;提取码&#xff1a;bi7c&…

D. Water Tree

模板题 #include<iostream> #include<vector> using namespace std; const int N5e59; int n; //树剖 //1.转成线性部分 vector<int> e[N]; void add(int u,int v){e[u].push_back(v);e[v].push_back(u); } int fa[N],dep[N],sz[N],wc[N]; void dfs1(int u,…

了解芯片的四大主流架构

四大主流芯片架构&#xff0c;犹如科技领域的四大支柱&#xff0c;各自矗立于技术创新的巅峰。这四大架构——X86、ARM、RISC-V与MIPS&#xff0c;不仅是芯片设计的基石&#xff0c;更是推动信息技术进步的强大动力。 一、芯片架构是什么&#xff1f; 芯片架构是指对芯片的类…

记录一次SQL 查询 LEFT JOIN 相关优化

记录一次 LEFT JOIN 相关优化 1 环境说明2 sql 在dm库查询用时30秒2.1 sql 语句2.2 sql 执行计划 3 调优数据库参数3.1 使用hint 调整数据库参数3.2 hint 的执行计划 4 永久修改数据库参数5 参数说明6 达梦数据库学习使用列表 1 环境说明 某项目的公文办公系统在生产环境刚部署…

如何使用Pytest进行自动化测试

为什么需要自动化测试 自动化测试有很多优点&#xff0c;但这里有3个主要的点 可重用性:不需要总是编写新的脚本&#xff0c;除非必要&#xff0c;即使是新的操作系统版本也不需要编写脚本。 可靠性:人容易出错&#xff0c;机器不太可能。当运行不能跳过的重复步骤/测试时&…

不懂就问,换毛季猫咪疯狂掉毛怎么办?宠物浮毛该如何清理?

最近天气变热了&#xff0c;每天都30度以上&#xff0c;我家猫狂掉毛&#xff0c;床上、地板上堆积了不少。第一次养猫的我没见过这种阵仗&#xff0c;以为它生病了&#xff0c;连忙带它去看医生。医生告诉我&#xff0c;这是正常的猫咪换毛现象&#xff0c;我才放下心来。原来…

Unity动画模块 之 3D模型导入基础设置 Rig页签

​本文仅作笔记学习和分享&#xff0c;不用做任何商业用途本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 1.Rig页签 Rig 选项卡 - Unity 手册&#xff0c;rig是设置骨骼与替身系统的&#xff0c;工作流程如下 Avatar是什么…

C语言每日好题(3)

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 #define _CRT_SECURE_NO_WARNING #include <stdio.h> #include <string.h> int main(void) {if ((strlen("abc") - strlen("abcdef")) > 0)printf(">\n")…

【数据结构】TreeMap和TreeSet

目录 前言TreeMap实现的接口内部类常用方法 TreeSet实现的接口常用方法 前言 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 一般把搜索的数据称为关键字&#xff08;Key&#xff09;&#xff0c; 和关键字对应的称为…

Docker介绍、docker安装以及实现docker的远程管理

1.Docker介绍 1.Docker介绍 Docker 是⼀个开源的应用容器引擎&#xff0c;可以实现虚拟化&#xff0c;完全采用“沙盒”机制&#xff0c;容器之间不会存在任何接口。 Docker 通过 Linux Container&#xff08;容器&#xff09;技术将任意类型的应用进行包装&#xff0c;变成一…

Vue 自定义文字提示框

目录 前言代码演示相关代码文字提示框组件定义组件调用前言 今天开发遇上了一个新的问题,要求写一个带着滑动动画的文字提示框。但是我经常使用的Element-UI组件库只有淡入淡出效果,并且想要修改样式只能全局修改,非常不利于后期的开发。因此,我最终选择直接自定义一个符合…

EXCEL 分段排序--Excel难题#86

Excel某表格有3列。 ABC1A1B1512A2B27213A3B33824A4B495A5B5736A6B65777A7B7918A13B131509A14B144910A17B1770211A18B1870512A34B343313A35B3540914A36B3657915A37B3710 现在要求对表格按照第3列进行分段排序&#xff0c;由小到大排列。第1段&#xff1a;第3列小于等于50&…

vue3 antdv3 去掉Modal的阴影背景,将圆角边框改为直角的显示,看上去不要那么的立体的样式处理。

1、来个没有处理的效果图&#xff1a; 这个有立体的效果&#xff0c;有阴影的效果。 2、要处理一下样式&#xff0c;让这个阴影的效果去掉&#xff1a; 图片的效果不太明显&#xff0c;但是阴影效果确实没有了。 3、代码&#xff1a; /* 去掉遮罩层阴影 */.ant-modal-mask {…