网络中UDP编程

网络

1.recvfrom

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
    功能:
        从套接字中接收数据
    参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        flags:属性 默认为0 
        src_addr:存放IP地址信息的空间首地址
        addrlen:存放接收到IP地址大小空间的首地址
    返回值:
        成功返回实际接收字节数
        失败返回-1 

修改虚拟机到桥接模式:

    点击"虚拟机"
    点击"设置"
    点击"网络适配器"
    选择"桥接模式"
    点击"确定"

将网卡桥接到无线网卡

    点击"编辑"
    点击"虚拟网络编辑器"
    点击"更改设置"

在Ubuntu中重启网络服务

    sudo /etc/init.d/networking restart  --- 重启网络

    ifconfig  ---  查看linux的网络ip地址

2.bind 

   int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
    功能:
        在套接字上绑定一个IP地址和端口号
    参数:
        sockfd:套接字文件描述符
        addr:绑定IP地址空间首地址
        addrlen:绑定IP地址的长度
    返回值:
        成功返回0 
        失败返回-1 


3.UDP编程:

    发端:socket (创建套接字文件)-> sendto(发端) -> close 
    收端:  socket(创建套接字文件)-> bind (定义收端的端口和ip)-> recvfrom(收端) ->                        close 

eg:发端代码   /    收端代码

#include"head.h"

int main(void)                  //发端
{
	int sockfd = 0;
	struct sockaddr_in sendaddr;
	char tmpbuff[1024] = {0};   //储存发送内容的信息
	ssize_t nsize = 0;

	fgets(tmpbuff,sizeof(tmpbuff),stdin);

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);   //数据报套接字        //创建一个用来通信的文件描述符
	if(sockfd == -1)
	{
		perror("fail to socket");
		return -1;
	}

	sendaddr.sin_family = AF_INET; //协议族
	sendaddr.sin_port = htons(50000);   //端口号    //将本地字节序转换为网络的大端字节序   //要发送的主机端口号
	sendaddr.sin_addr.s_addr = inet_addr("192.168.1.182");   //ip    //将字符串IP地址转换内存中的ip地址    //要发送的主机ip号
	nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&sendaddr, sizeof(sendaddr)); //利用套接字向指定地址发送数据信息
    if (-1 == nsize)
	{
		perror("fail to sendto");
		return -1;
	}

	printf("已发送个 %ld 字节1\n",nsize);

	close(sockfd);

	return 0;

}
#include"head.h"

int main(void)                                     //收端
{
	int sockfd = 0;
	int ret = 0;
	struct sockaddr_in recvaddr; 
	struct sockaddr_in tmpaddr;          //存储收信息的主机的端口和ip
	char tmpbuff[1024] = {0};
	ssize_t nsize = 0;
	socklen_t addrlen =  sizeof(tmpaddr);

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if (-1 == sockfd)
	{
		perror("fail to socket");
		return -1;
	}

	/* 绑定自己的端口和ip地址 */     //ip地址 用ifconfig 查看
	recvaddr.sin_family = AF_INET;
	recvaddr.sin_port = htons(30000);
	recvaddr.sin_addr.s_addr = inet_addr("192.168.1.176");
	ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));
	if(ret == -1)
	{
		perror("fail to bind");
		return -1;
	}

	/* 接收的信息内容 */
	nsize = recvfrom(sockfd,tmpbuff,sizeof(tmpbuff),0,(struct sockaddr *)&tmpaddr,&addrlen);
	if (-1 == nsize)
	{
		perror("fail to recvfrom");
		return -1;
	}

	printf("接收到了%ld个字节\n",nsize);

	printf("RECV ASCII FROM %s:%d>%s\n", inet_ntoa(tmpaddr.sin_addr), ntohs(tmpaddr.sin_port), tmpbuff);    //打印接收信息的主机的端口和ip地址
	close(sockfd);

	return 0;


}

4.UDP需要注意的细节点:

    1.UDP是无连接,发端退出,收端没有任何影响
    2.UDP发送数据上限,最好不要超过1500个字节
    3.UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失

5.wireshark  抓包工具

  操作流程:
    1.sudo wireshark
      打开wireshark抓包工具
    2.选择抓取数据包的网卡
      any
    3.执行通信的代码
    4.停止通信
    5.设定过滤条件
        ip.addr == IP地址 
        udp 
        tcp 
        udp.port == 端口

6.UDP包头长度:8个字节

    源端口号(2个字节)
    目的端口号(2个字节)
    长度(2个字节)
    校验和(2个字节)


http://www.niftyadmin.cn/n/5411061.html

相关文章

nvm安装、部署以及使用

1. nvm安装 官方地址:https://github.com/nvm-sh/nvm/blob/master/README.md nvm window安装:https://github.com/coreybutler/nvm-windows/releases 看个人习惯,通过不同形式来安装nvm,省劲就用.exe安装即可。 Tips&#xff1…

Ubuntu20.04安装并配置vscode

Ubuntu20.04安装并配置vscode vscode安装miniconda安装创建虚拟python3.8环境pytorch和匹配的cuda安装 vscode安装 VSCode可以通过 Snapcraft 商店或者微软源仓库中的一个 deb 软件包来安装。 我们这里选用安装VSCode snap版,打开你的终端(CtrlAltT)并且运行下面的…

Django学习记录08——图表及文件上传案例

1.图表Echarts的应用 Apache ECharts 1.1 使用方法 引用echarts.js即可到官方文档中查询使用 1.2 常用图标的使用 图表展示页面的部署&#xff08;主要展示折线图、柱状图、饼图&#xff09; {% block content %}<div class"container"><div class&qu…

初学C++

注释 变量 作用&#xff1a;给一段指定的内存空间起名&#xff0c;方便操作这段内容 数据类型 变量名 变量初始值; 常量 用于记录程序中不可更改的数据 宏常量&#xff1a; #define 宏常量 常量值 const修饰的变量&#xff1a; const 数据类型 常量名 常量值; 关键字 …

python转换json

import json import os from enum import Enumclass LaneDirectionType(int, Enum):LaneDirectionType_Unknown -1 # 类型未知OneWay 1 # 单向TwoWay 2 # 双向# 颜色类型 class ColorCombo(int, Enum):NOUSE 0 # 默认值UNKNOWN 1000 # 未定义WHITE 1 # 白色(默认值…

智慧路灯物联网解决方案

概述 城市路灯是与人们生活息息相关的重要公共基础设施,一方面保证夜间车辆和行人的交通的安全,另一方面承担了整个城市形象美化的重任。路灯作为城市重要基础设施,遍布城市所有的交通网络。当前随着我国新型城市的发展,更多与城市环境、民生相关的问题,已纳入到现代城市建…

数据结构(七)——线性表的基本操作

&#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ …

windows mysql 安装教程

1.下载mysql安装包 地址 2.解压并创建my.ini配置文件 my.ini内容&#xff1a; [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 ---这里输入你安装的文件路径---- basedirG:\mysql\mysql-8.0.28-winx64\mysql-8.0.28-winx64 # 设置mysql数据库的数据的存放目录 data…