两台电脑之间的MATLAB-udp通讯

先向大家介绍一下,目前作者正在做的工作,希望使用FPGA能够通过UDP协议向PC机的网络端口发送大量的数据包,但是当数据包的量达到一定程度的时候抓包工具就会出现错误,以至于MATLAB没有办法读到数据。

由于作者一直认为是MATLAB自身的问题没有读到该数据,因此,希望通过两台电脑之间的通讯进行测试MATLAB中的代码是否有问题。

那么接下来就介绍一下我的工作把。(实现电脑A向电脑b的数据发送)

 

 step1:配置电脑A: IP 为192.168.0.5 掩码:255 255 255 0  默认网关:192.168.0.1 

             配置i电脑B:IP 为192.168.0.3 掩码:255 255 255 0  默认网关:192.168.0.1 

step2:配置电脑B以使得其认识电脑A(网络通讯概念,需要知道电脑a的mac地址)

            在电脑b中,管理员方式打开命令窗口,输入:arp -s  电脑b -ip  电脑b-mac 

          (至于电脑的mac地址如何查,请自行百度,可以使用:ipconfig /all)

                     

step3 matlab的代码编写(下面列出核心代码)

(电脑A )

ipA = '192.168.0.5'; 
portA = 8080;
ipB = '192.168.0.3';
portB = 8080;
handles.udpA = udp(ipB,portB,'LocalPort',portA);
set(handles.udpA,'OutputBufferSize',8192);
set(handles.udpA,'TimeOut',100);
fopen(handles.udpA);
for t = 1:100
    x = sin(t);
    set(handles.edit1,'String',x);
    v1=str2double(get(handles.edit1,'string'));
    w1(t)=v1;
    fprintf(handles.udpA,v1);
    pause(0.1);
end

(电脑B)

ipA='192.168.0.5'; 
portA=8080;
ipB='192.168.0.3';
portB=8080;
handles.udpB=udp(ipA,portA,'LocalPort',portB);
set(handles.udpB,'TimeOut',10);
set(handles.udpB,'InputBufferSize',8192);
fopen(handles.udpB);

for t = 1:15
    a1 = str2double(fscanf(handles.udpB));
    set(handles.edit1,'string',a1);
    pause(0.1);
end


step4 运行代码(并在电脑b 中使用抓包工具进行检测,本人使用的wireshark) 观察包的长度问题 以及传送的包的个数问题

 

总结:上面的核心代码是很灵活的,可以随机调整,完整的代码作者将会贴在后面,同时也可以实现同步或者异步的接收,总结有以下

关于udp的数据发送

如果传送的数据包的大小小于512  就会完整发送    

如果传送的数据包大于512 就会分包发送(MATLAB自动分)

—————

 

思考:下面截取别人blog中的内容:https://blog.csdn.net/caoshangpa/article/details/51530685

1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;  

2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480; 
3.在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;   
所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。   
从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。   
但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内

1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;  

2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480; 
3.在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;   
所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。   
从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。   

 

但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内

______--------------------------------2020-12-10更新~------------------------------

经过了两年的学习于理解,经常又博友问我这个东西是什么意思,完整代码在哪里,这次,我从新找了一下 以前的工作,此处我贴出来github地址。方便下载:

https://github.com/Scottars/matlab_udp

 

 

 

 

  • 11
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有水杯和雨伞的工科男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值