不使用ip和port如何进行网络通讯(raw socket应用例子)

主要应用方向是上位机和嵌软(如stm32单片机)通讯,不在单片机中嵌入web server,即mac层通讯。

一、下面先了解网络数据包组成。

常见数据包的包头长度:

EtherHeader Length: 14 Bytes
TCP Header Length  : 20 Bytes
UDP Header Length  : 8  Bytes
IP Header Length   : 20 Bytes

1.网络封包的整体过程

b9862fea2f087d3b67094930ca880936.jpeg

2.IP 数据包

ebe7e9e778a89d7d0a9bd7fbd266818f.jpeg

3.Tcp 数据包

f763a400c69a49311c807b249ae4496a.jpeg7b1c612c34741ef7baac1e79edae9321.jpeg

4.UDP 数据包

4e2df6d230034d23311d2400c5166cfa.jpeg

0c2adb2da346d1c29b7fcb33713a6220.jpeg

5、Ethernet Header:

fdd860a2aceebbf59b8ef1b60712b65f.jpeg

6、ICMP Packet:

7f10af18128e0f93ec9a62d1b03761ba.jpeg

82472f4e781681fc355abb288f78d455.jpeg

7、ARP Packet:

32a04db59f20953a00cacb832e283881.jpeg

二、程序接收报文示例

*************************UDP Packet******************************
Ethernet Header|-Source Address  : 00-0C-29-64-D9-F5|-Destination Address  : FF-FF-FF-FF-FF-FF|-Protocol    : 8IP Header|-Version              : 4|-Internet Header Length  : 5 DWORDS or 20 Bytes|-Type Of Service   : 16|-Total Length      : 33  Bytes|-Identification    : 10201|-Time To Live      : 64|-Protocol       : 17|-Header Checksum   : 37369|-Source IP         : 0.0.0.0|-Destination IP    : 192.168.0.66UDP Header|-Source Port      : 23451|-Destination Port  : 23452|-UDP Length        : 13|-UDP Checksum     : 0DataAA  BB  CC  DD  EE  00  00  00  00  00  00  00  00  00  00  00 00  00  00  00  00  00 
*****************************************************************

三、程序示例

程序环境:ubuntu 14.04 send(虚拟机,自定义模式 VMnet1)

                 Ubuntu 16.04 recv(虚拟机,自定义模式 VMnet1)

1、send

int main()
{sock_raw=socket(AF_PACKET,SOCK_RAW,IPPROTO_RAW);if(sock_raw == -1)printf("error in socket");// increase in case of large data.Here data is --> AA  BB  CC  DD  EEsendbuff=(unsigned char*)malloc(64); memset(sendbuff,0,64);get_eth_index();  // interface numberget_mac();get_ip();struct sockaddr_ll sadr_ll;
//        sadr_ll.sll_ifindex = ifreq_i.ifr_ifindex;sadr_ll.sll_ifindex = if_nametoindex("eth0");sadr_ll.sll_halen   = ETH_ALEN;sadr_ll.sll_addr[0]  = DESTMAC0;sadr_ll.sll_addr[1]  = DESTMAC1;sadr_ll.sll_addr[2]  = DESTMAC2;sadr_ll.sll_addr[3]  = DESTMAC3;sadr_ll.sll_addr[4]  = DESTMAC4;sadr_ll.sll_addr[5]  = DESTMAC5;printf("sending...\n");while(1){send_len = sendto(sock_raw,sendbuff,64,0,(const struct sockaddr*)&sadr_ll,sizeof(struct sockaddr_ll));if(send_len<0){printf("error in sending....sendlen=%d....errno=%d\n",send_len,errno);return -1;}}
}

2、recv

/* Note: run this program as root user* Author:Subodh Saxena */
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<signal.h>
#include<stdbool.h>
#include<sys/socket.h>
#include<sys/types.h>#include<linux/if_packet.h>
#include<netinet/in.h>     
#include<netinet/if_ether.h>    // for ethernet header
#include<netinet/ip.h>    // for ip header
#include<netinet/udp.h>    // for udp header
#include<netinet/tcp.h>
#include<arpa/inet.h>           // to avoid warning at inet_ntoaFILE* log_txt;
int total,tcp,udp,icmp,igmp,other,iphdrlen;struct sockaddr saddr;
struct sockaddr_in source,dest;void ethernet_header(unsigned char* buffer,int buflen)
{struct ethhdr *eth = (struct ethhdr *)(buffer);fprintf(log_txt,"\nEthernet Header\n");fprintf(log_txt,"\t|-Source Address  : %.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",eth->h_source[0],eth->h_source[1],eth->h_source[2],eth->h_source[3],eth->h_source[4],eth->h_source[5]);fprintf(log_txt,"\t|-Destination Address  : %.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",eth->h_dest[0],eth->h_dest[1],eth->h_dest[2],eth->h_dest[3],eth->h_dest[4],eth->h_dest[5]);fprintf(log_txt,"\t|-Protocol    : %d\n",eth->h_proto);}void ip_header(unsigned char* buffer,int buflen)
{struct iphdr *ip = (struct iphdr*)(buffer + sizeof(struct ethhdr));iphdrlen =ip->ihl*4;memset(&source, 0, sizeof(source));source.sin_addr.s_addr = ip->saddr;     memset(&dest, 0, sizeof(dest));dest.sin_addr.s_addr = ip->daddr;     fprintf(log_txt , "\nIP Header\n");fprintf(log_txt , "\t|-Version              : %d\n",(unsigned int)ip->version);fprintf(log_txt , "\t|-Internet Header Length  : %d DWORDS or %d Bytes\n",(unsigned int)ip->ihl,((unsigned int)(ip->ihl))*4);fprintf(log_txt , "\t|-Type Of Service   : %d\n",(unsigned int)ip->tos);fprintf(log_txt , "\t|-Total Length      : %d  Bytes\n",ntohs(ip->tot_len));fprintf(log_txt , "\t|-Identification    : %d\n",ntohs(ip->id));fprintf(log_txt , "\t|-Time To Live      : %d\n",(unsigned int)ip->ttl);fprintf(log_txt , "\t|-Protocol       : %d\n",(unsigned int)ip->protocol);fprintf(log_txt , "\t|-Header Checksum   : %d\n",ntohs(ip->check));fprintf(log_txt , "\t|-Source IP         : %s\n", inet_ntoa(source.sin_addr));fprintf(log_txt , "\t|-Destination IP    : %s\n",inet_ntoa(dest.sin_addr));
}void payload(unsigned char* buffer,int buflen)
{int i=0;unsigned char * data = (buffer + iphdrlen  + sizeof(struct ethhdr) + sizeof(struct udphdr));fprintf(log_txt,"\nData\n");int remaining_data = buflen - (iphdrlen  + sizeof(struct ethhdr) + sizeof(struct udphdr));for(i=0;i<remaining_data;i++){if(i!=0 && i%16==0)fprintf(log_txt,"\n");fprintf(log_txt," %.2X ",data[i]);}fprintf(log_txt,"\n");}void tcp_header(unsigned char* buffer,int buflen)
{fprintf(log_txt,"\n*************************TCP Packet******************************");ethernet_header(buffer,buflen);ip_header(buffer,buflen);struct tcphdr *tcp = (struct tcphdr*)(buffer + iphdrlen + sizeof(struct ethhdr));fprintf(log_txt , "\nTCP Header\n");fprintf(log_txt , "\t|-Source Port          : %u\n",ntohs(tcp->source));fprintf(log_txt , "\t|-Destination Port     : %u\n",ntohs(tcp->dest));fprintf(log_txt , "\t|-Sequence Number      : %u\n",ntohl(tcp->seq));fprintf(log_txt , "\t|-Acknowledge Number   : %u\n",ntohl(tcp->ack_seq));fprintf(log_txt , "\t|-Header Length        : %d DWORDS or %d BYTES\n" ,(unsigned int)tcp->doff,(unsigned int)tcp->doff*4);fprintf(log_txt , "\t|----------Flags-----------\n");fprintf(log_txt , "\t\t|-Urgent Flag          : %d\n",(unsigned int)tcp->urg);fprintf(log_txt , "\t\t|-Acknowledgement Flag : %d\n",(unsigned int)tcp->ack);fprintf(log_txt , "\t\t|-Push Flag            : %d\n",(unsigned int)tcp->psh);fprintf(log_txt , "\t\t|-Reset Flag           : %d\n",(unsigned int)tcp->rst);fprintf(log_txt , "\t\t|-Synchronise Flag     : %d\n",(unsigned int)tcp->syn);fprintf(log_txt , "\t\t|-Finish Flag          : %d\n",(unsigned int)tcp->fin);fprintf(log_txt , "\t|-Window size          : %d\n",ntohs(tcp->window));fprintf(log_txt , "\t|-Checksum             : %d\n",ntohs(tcp->check));fprintf(log_txt , "\t|-Urgent Pointer       : %d\n",tcp->urg_ptr);payload(buffer,buflen);fprintf(log_txt,"*****************************************************************\n\n\n");
}void udp_header(unsigned char* buffer, int buflen)
{fprintf(log_txt,"\n*************************UDP Packet******************************");ethernet_header(buffer,buflen);ip_header(buffer,buflen);fprintf(log_txt,"\nUDP Header\n");struct udphdr *udp = (struct udphdr*)(buffer + iphdrlen + sizeof(struct ethhdr));fprintf(log_txt , "\t|-Source Port      : %d\n" , ntohs(udp->source));fprintf(log_txt , "\t|-Destination Port  : %d\n" , ntohs(udp->dest));fprintf(log_txt , "\t|-UDP Length        : %d\n" , ntohs(udp->len));fprintf(log_txt , "\t|-UDP Checksum     : %d\n" , ntohs(udp->check));payload(buffer,buflen);fprintf(log_txt,"*****************************************************************\n\n\n");}void data_process(unsigned char* buffer,int buflen)
{struct iphdr *ip = (struct iphdr*)(buffer + sizeof (struct ethhdr));++total;/* we will se UDP Protocol only*/ switch (ip->protocol)    //see /etc/protocols file {case 6:++tcp;
//      tcp_header(buffer,buflen);break;case 17:++udp;udp_header(buffer,buflen);break;default:++other;}printf("TCP: %d  UDP: %d  Other: %d  Toatl: %d  \r",tcp,udp,other,total);}int main()
{int sock_r,saddr_len,buflen;unsigned char* buffer = (unsigned char *)malloc(65536); memset(buffer,0,65536);log_txt=fopen("log.txt","w");if(!log_txt){printf("unable to open log.txt\n");return -1;}printf("starting .... \n");sock_r=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); if(sock_r<0){printf("error in socket\n");return -1;}while(1){saddr_len=sizeof saddr;buflen=recvfrom(sock_r,buffer,65536,0,&saddr,(socklen_t *)&saddr_len);if(buflen<0){printf("error in reading recvfrom function\n");return -1;}fflush(log_txt);data_process(buffer,buflen);}close(sock_r);// use signals to close socket printf("DONE!!!!\n");}

如需完成发送程序,可关注公众号后,后台留言,说明所需程序。

欢迎关注公众号:

a4d4be1bb5bfc305e601ecf99bdf86bb.png

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

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

相关文章

Spring@Scheduled定时任务接入XXL-JOB的一种方案(基于SC Gateway)

背景 目前在职的公司&#xff0c;维护着Spring Cloud分布式微服务项目有25个。其中有10个左右微服务都写有定时任务逻辑&#xff0c;采用Spring Scheduled这种方式。 Spring Scheduled定时任务的缺点&#xff1a; 不支持集群&#xff1a;为避免重复执行&#xff0c;需引入分…

【VMware】CentOS 设置静态IP(Windows 宿主机)

文章目录 1. 更改网络适配器设置2. 配置虚拟网络编辑器3. 修改 CentOS 网络配置文件4. ping 测试结果 宿主机&#xff1a;Win11 22H2 虚拟机&#xff1a;CentOS-Stream-9-20230612.0 (Minimal) 1. 更改网络适配器设置 Win R&#xff1a;control 打开控制面板 依次点击&#x…

【应用层】网络基础 -- HTTPS协议

HTTPS 协议原理加密为什么要加密常见的加密方式对称加密非对称加密 数据摘要&&数据指纹 HTTPS 的工作过程探究方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密中间人攻击-针对上面的场景 CA认证理解数据签名方案5-非对…

15-模型 - 一对多 多对多

一对多&#xff1a; 1. 在多的表里定义外键 db.ForeignKey(主键) 2. 增加字段 db.relationship 建立联系 ("关联表类名","反向引用名") from ext import db# 一 class User(db.Model):id db.Column(db.Integer, primary_keyTrue, autoincrementTrue)us…

Dart PowerTCP Emulation for .NET Crack

Dart PowerTCP Emulation for .NET Crack .NET CF上的PowerTCP Emulation为手持设备提供了高级的Internet通信组件。这些功能允许同步操作&#xff0c;这样可以消耗更少的资源&#xff0c;提供更大的灵活性&#xff0c;并生成易于维护的软件。带有.NET的PowerTCP仿真包括VT52、…

gpt-3.5-turbo微调图形界面;Hugging Face完成2.35亿美元融资

&#x1f989; AI新闻 &#x1f680; 人工智能初创公司Hugging Face完成2.35亿美元融资&#xff0c;估值达到45亿美元 摘要&#xff1a;总部位于纽约的人工智能初创公司Hugging Face完成了一轮2.35亿美元的融资&#xff0c;估值达到45亿美元。本轮融资的投资者包括谷歌、亚马…

几个nlp的小任务(多选问答)

@TOC 安装库 多选问答介绍 定义参数、导入加载函数 缓存数据集 随机选择一些数据展示 进行数据预处理部分(tokenizer) 调用t

Android全面屏下,默认不会全屏显示,屏幕底部会留黑问题

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 公司以前的老项目&#xff0c;便出现了这种情况&#xff0c;网上搜索了各种资料&#xf…

Web Components详解-Custom Elements

目录 引言 演变过程 概述 使用方式 创建标签 定义标签 使用标签 获取标签 异步定义标签 升级标签 完整案例 结语 相关代码 参考文章 引言 随着项目体量的增大&#xff0c;组件化和模块化的优势也愈发明显了&#xff0c;构建可重复使用、独立、可互操作的组件变得…

【Java基础】Java注解与反射

文章目录 ⭐️写在前面的话⭐️1、什么是注解&#xff1f;注解的分类常用的Java注解 2、元注解TargetRetentionDocumentedInherited 3、自定义注解Override注解的基本格式 4、什么是反射&#xff1f;什么时候需要用到反射&#xff1f;反射的应用场合 5、反射的原理6、反射机制的…

基于AVR128单片机智能传送装置

一、系统方案 1、板载可变电阻&#xff08;电位器&#xff09;R29的电压作为处理器ATmega128的模数转换模块中单端ADC0的模拟信号输入&#xff08;跳线JP13短接&#xff09;。 2、调节电位器&#xff0c;将改变AD转换接口ADC0的模拟信号输入&#xff0c;由处理器完成ADC0的A/D转…

生态经济学领域里的R语言机器学(数据的收集与清洗、综合建模评价、数据的分析与可视化、数据的空间效应、因果推断等)

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

光谱成像系统视觉均匀校准积分球光源

数字相机的光谱灵敏度是成像传感器、光学透镜、滤光片以及相机内部图像处理过程等诸多因素的综合结果。即使是同一台相机&#xff0c;采用不同的光学镜头和不同的滤光片&#xff0c;由于光学系统的结构和光学材料的透过率不同&#xff0c;导致整个成像系统的光谱灵敏度也有所差…

计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

使用锐捷RG-EG210G-E路由器实现两个IP地址冲突的局域网互通

需求背景&#xff1a; 之前写过一篇博文使用路由器实现三个不同网段局域网内的计算机相互访问&#xff0c;链接如下 https://blog.csdn.net/agang1986/article/details/131862160 当前的需求又发生了变更&#xff0c;有两个独立的局域网&#xff0c;内部的计算机个数和配置的IP…

C语言(第三十三天)

3.1.2 画图推演 3.2 举例2&#xff1a;顺序打印一个整数的每一位 输入一个整数m&#xff0c;打印这个按照顺序打印整数的每一位。 比如&#xff1a; 输入&#xff1a;1234 输出&#xff1a;1 2 3 4 输入&#xff1a;520 输出&#xff1a;5 2 0 3.2.1 分析和代码实现 这个题目&a…

方案:AI边缘计算智慧工地解决方案

一、方案背景 在工程项目管理中&#xff0c;工程施工现场涉及面广&#xff0c;多种元素交叉&#xff0c;状况较为复杂&#xff0c;如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时&#xff0c;需要提前报告&#xff0…

javaCV实现java图片ocr提取文字效果

引入依赖&#xff1a; <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.5</version></dependency> 引入中文语言训练数据集&#xff1a;chi_sim GitHub - tesseract-ocr…

windows下如何搭建属于自己的git服务器

前一阵子公司需要&#xff0c;领导让我给我们技术部搭建一个git服务器。以前看过教程&#xff0c;但自己没动手做过&#xff0c;开始按照网上的教程来&#xff0c;但搭建过程中发现还是不够详细&#xff0c;今天给大家一个比较详细的&#xff0c;希望对大家有帮助。 高能预警&a…

容器化微服务:用Kubernetes实现弹性部署

随着云计算的迅猛发展&#xff0c;容器化和微服务架构成为了构建现代应用的重要方式。而在这个过程中&#xff0c;Kubernetes&#xff08;常简称为K8s&#xff09;作为一个开源的容器编排平台&#xff0c;正在引领着容器化微服务的部署和管理革命。本文将深入探讨容器化微服务的…