网络连接 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
相关推荐
Proxy71133 分钟前
SOCKS5代理为何比HTTP代理更快?
网络·网络协议·http
qq_3168377544 分钟前
https的连接过程
网络·网络协议·ssl
bigbig猩猩44 分钟前
OpenMV与STM32
stm32·单片机·嵌入式硬件
板栗焖小鸡1 小时前
【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作
stm32·单片机·嵌入式硬件
行弟学习笔记1 小时前
对网页聊天项目进行性能测试, 使用JMeter对于基于WebSocket开发的webChat项目的聊天功能进行测试
websocket·网络协议·jmeter
只吹45°风1 小时前
HTTPS是如何保证安全传输的
网络协议·安全·https
Chambor_mak1 小时前
stm32单片机个人学习笔记6(EXTI外部中断)
stm32·单片机·学习
.Net Core 爱好者2 小时前
ASP .NET CORE 6 项目实现WebSocket通信实践
网络·websocket·网络协议·c#·.net·.netcore·visual studio
咩咩大主教3 小时前
C++在Linux实现多线程和多进程的TCP服务器和客户端通信
linux·服务器·c语言·开发语言·c++·网络协议·tcp/ip
A尘埃4 小时前
RPC远程调用的序列化框架
网络·网络协议·rpc·序列化