udp 的 listen
有一个想法:由于 udp 是无连接的 包传输模式! 所以有时在局域网想使用udp,但是 udp 是无连接的, 如果使用UDP 做服务器, 其是无连接的,那怎样实现其tcp的四元组有链接呢??
想了一下:udp 添加listen 字段就行!!
--------------------
sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable); if (sk) return udp_unicast_rcv_skb(sk, skb, uh); ------------- __UDP_INC_STATS(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE); icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); /* * Hmm. We got an UDP packet to a port to which we * don't wanna listen. Ignore it. */ kfree_skb(skb);
可以看到 收到 udp 报文时首先在 udp_table 中udp4_lib_lookup_skb 查找对应的sk
查找到后执行 udp_unicast_rcv_skb 处理其报文
否者drop 报文并发送对应icmp 信息
是否可以这样设计:
首先在udp_table 中查找 sk 如果查找到了并且 sk->sk_state != UDP_LISTEN rcv_skb 逻辑
如果查找到并且sk->sk_state == UDP_LISTEN 则 在 udp_table_listen 中进行检查 合格后 创建新的new_udp_sk;然后执行skb->sk=new_udp_sk 赋值,接着执行 rcv_skb 逻辑 处理数据;
最后将new_udp_sk insert 到 udp_table中
sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);
if (sk != NULL) {
// 这个UDP_LISTEN,通过setsockopt来设置
if (sk->sk_state == UDP_LISTEN) {
// 如果是UDP的listener,创建一个新的new_udp_sk
struct sock *new_udp_sk = inet_v4_udp_clone(sk, skb, GFP_ATOMIC);
// 将新的数据传输sk排入全局的UDP socket hash表
new_udp_sk->sk_prot->get_port(new_udp_sk, new_udp_sk->inet_num)
ret =udp_unicast_rcv_skb(new_udp_sk, skb, uh);
// 唤醒I/O复用 ---->唤醒accept 获取新的connect udp-sk
sk->sk_data_ready(sk, 0);
sock_put(new_udp_sk);
}else {
//正常内核协议栈原始逻辑
}
}
http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!!
但行好事 莫问前程
--身高体重180的胖子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人