网络连接 UDP2,UDP Connect, bind, send, recieve认知, -入门8

LWIP编程接口有RAW, NETCONN, SOCKET

2.UDP函数的理解

#define UDP_SERVER_PORT 8000 //PC side

#define UDP_CLIENT_PORT 1234 // ctrl board side

//PC IP address

#define DEST_IP_ADDR0 192

#define DEST_IP_ADDR1 168

#define DEST_IP_ADDR2 3

#define DEST_IP_ADDR3 115

/* Create a new UDP control block */

upcb = udp_new();

if (upcb!=NULL)

{

/*assign destination IP address */

IP4_ADDR( &DestIPaddr, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3 );

复制代码
/* configure destination IP address and port */
   //?表示只接受指定地址来的信号?
err= udp_connect(upcb, &DestIPaddr, UDP_SERVER_PORT);

if (err == ERR_OK)
{
  err=udp_bind(upcb,IP_ADDR_ANY,UDP_CLIENT_PORT);
  if(err == ERR_OK)
  {
    /* Set a receive callback for the upcb */
    udp_recv(upcb, udp_receive_callback, NULL);          
  }
}

}

}
2.1,udp_connect,用来绑定接收
可以参考: https://blog.csdn.net/qjh5606/article/details/89608555?ops_request_misc=\&request_id=\&biz_id=102\&utm_term=udp中connect参数的含义\&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb\~default-1-89608555.142^v99^control\&spm=1018.2226.3001.4187
a. 用来接收
特定地址
特定端口 来的信息。 否则用SendTo函数。

b. 也可以提高通信效率
假如接收任何IP来的信息如下

/* configure destination IP address and port */

// err= udp_connect(upcb, &DestIPaddr, UDP_SERVER_PORT);

err = ERR_OK;
在UDP通信中,如果你只往一个地址发送 ,那么你也可以先connect指定地址,然后调用 send,recv

err= udp_connect(upcb, &DestIPaddr, UDP_SERVER_PORT);

tcp与udp的connect不同

UDP中connect操作与TCP中connect操作有着本质区别:

TCP中调用connect会引起三次握手,client与server建立连结

UDP中调用connect内核仅仅把对端ip&port记录下来.

UDP中可以多次调用connect,TCP只能调用一次connect

UDP多次调用connect有两种用途:1,指定一个新的ip&port连结. 2,断开和之前的ip&port的连结.

指定新连结,直接设置connect第二个参数即可.

断开连结,需要将connect第二个参数中的sin_family设置成 AF_UNSPEC即可.

UDP中使用connect可以提高效率的原因

普通的UDP发送两个报文内核做了如下:

#1:建立连结

#2:发送报文

#3:断开连结

#4:建立连结

#5:发送报文

#6:断开连结

采用connect方式的UDP发送两个报文内核如下处理:

#1:建立连结

#2:发送报文

#3:发送报文另外一点,

每次发送报文内核都由可能要做路由查询.

2.2, udp_bind ,用来绑定发送目的地址

a. err=udp_bind(upcb,IP_ADDR_ANY,UDP_CLIENT_PORT);//绑定端口信息,

b.udp_sendto(upcb, p, &DestIPaddr,UDP_CLIENT_PORT);/指定发送的目标地址

c. udp_send(upcb, p); 假如没有Connect, 也没有Bind,就应该广播模式了

https://huaweicloud.csdn.net/63561d20d3efff3090b5acae.html?spm=1001.2101.3001.6661.1\&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromBaidu~activity-1-71616748-blog-83218773.235^v40^pc_relevant_anti_vip_base\&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromBaidu~activity-1-71616748-blog-83218773.235^v40^pc_relevant_anti_vip_base\&utm_relevant_index=1

udp服务器调用了bind()函数为服务器套接字绑定本地地址/端口,这样使得客户端的能知道它发数据的目的地址/端口,服务器如果单单接收客户端的数据,或者先接收客户端的数据(此时通过recvfrom()函数获取到了客户端的地址信息/端口)再发送数据,客户端的套接字可以不绑定自身的地址/端口,因为udp在创建套接字后直接使用sendto(),隐含操作是,在发送数据之前操作系统会为该套接字随机分配一个合适的udp端口,将该套接字和本地地址信息绑定。

但是,如果服务器程序就绪后一上来就要发送数据给客户端,那么服务器就需要知道客户端的地址信息和端口,那么就不能让客户端的地址信息和端口号由客户端所在操作系统分配,而是要在客户端程序指定了。怎么指定,那就是用bind()函数:

  1. UDP用的一些操作
    a. 设备,电脑 连接到Router,动态分配地址
    b. 开发板动态分配地址是192.168.3.110
    c. 电脑有线动态分配地址是192.168.3.115
    d. 开发板端口是1234, 电脑端口是8000
相关推荐
pythonchashaoyou1 小时前
静态住宅ip是什么,静态住宅IP选型全解
网络·网络协议·tcp/ip
来自晴朗的明天1 小时前
2、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程
良许Linux2 小时前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式
清风6666663 小时前
基于单片机的多路温湿度采集与WIFI智能报警控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
爱吃番茄鼠骗3 小时前
回顾ESP32S3系列---基础篇(Bootloader)
单片机·嵌入式硬件
青椒*^_^*凤爪爪4 小时前
Vscode下调试STM32N6系列单片机的方法
vscode·单片机·stm32n6·stm32n647
余生皆假期-4 小时前
永磁同步电机下桥三电阻采样方式的电机电流重构方法
单片机·嵌入式硬件·嵌入式
科技块儿4 小时前
如何定期向监管部门报送IP属地统计报表?
网络·网络协议·tcp/ip
win x4 小时前
UDP Socket
网络·网络协议·udp
蓬荜生灰5 小时前
STM32(12)-- GPIO输入,按键检测
stm32·单片机·嵌入式硬件