linux套接字--udp协议实现网络通信

本文详细介绍了在Linux环境下,如何基于UDP协议实现客户端和服务端的网络通信。内容涵盖创建套接字、绑定地址、发送和接收数据、关闭套接字等关键步骤,并解释了相关函数如socket(), bind(), sendto(), recvfrom()的用法。同时,文中提到了套接字在内存中的缓冲区机制以及地址和端口的绑定原理。" 100144600,2084217,树莓派4B安装Neo4j图数据库教程,"['树莓派4B', 'Neo4j', '数据库安装']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于udp协议实现网络通信:(套接字实现)
客户端 —> 服务端
Socket接口:通过网卡将数据传输出去,操作系统提供了一套网络编程接口
怎么操作网卡?—>(网卡是设备–>linux一切皆文件–>操作网卡就是操作文件,socket也是文件以(d目录文件-普通文件b块设备文件c字符设备文件l软链接文件(符号链接文件)p管道文件s套接字文件(平时看不到)))
对于客户端:步骤
1.创建套接字(操作系统内部涉及到创建文件描述信息,创建套接字的信息创建各自结构和网卡直接建立关联并且返回套接字描述符(本质文件描述符)),建立与网卡的关联
2.对客户端(主动发起请求方告诉别人的地址发送哪里去)就是为套接字绑定地址信息(告诉套接字,操作网卡向外发送数据的时候写源地址源端口写多少(ipdi地址端口放进去))但是对于客户端不推荐手动绑定,会失败(希望操作系统绑定对于套接字绑定源端口和源地址可能会导致失败(已经被占用了),一个端口不能被多个进程使用只能被一个进程使用(会导致数据二义性),但是一个进程可以有多个端口,意味着别人把端口占了自己就没办法发送数据了所以对于客户端程序不推荐绑定地址信息,)
如果不手动绑定在发送数据的时候操作系统发现没有绑定信息,会替我们自动选择合适的地址端口进行绑定(减少了绑定的失败率)
3.发送数据:
客户端不能先接受数据(eg:qq聊天写入了腾讯服务器地址和端口才能将数据发送到同一服务器,腾讯服务器不会记录客户端的ip地址(地址动态分配,上网ip地址不定,每次上网ip地址不定所以没必要记录,)腾讯不知道客户端地址,–>客户端主动发起请求方否则服务端不知道地址信息没办法给它发送数据)
所以先发送数据然后才能接受信息(发送数据已经携带了源端口信息和源地址回复的时候才能回过来)
4.接受数据
5.关闭套接字释放资源(文件描述符占位(inode结点))
对于服务端:
1.创建套接字(建立网卡之间关联)
2.为套接字绑定地址信息(必须自己绑定固定)
3.接受数据
4.发送数据
5.关闭套接字
Udp涉及的关键字:1创建套接字socket() 2.绑定地址信息bind() 3.发送数据(数据发送到哪里去) sedto() 4.接受数据(从哪接受数据接受的是什么数据) recvfrom() 5.关闭套接字 close()
/网卡接收到网络数据之后会先把数据放到内存中做缓冲(不缓冲没处放丢掉了)如何让在
12 //接受的时候接受的是自己的数据(qq接受的是qq数据而不是微信数据),网卡在接收数据的
13 //时候看数据发送到哪个地址端口(相当于创建缓冲区的时候也是根据地址信息创建,每一个
14 //套接字都有一个缓冲区),那么给一个套接字创建一个套接字给套接字绑定了一个地址端口 15 //信息这时候网卡接收到信息后数据之后是哪个地址和端口的会看下操作系统上面到底是
16 //哪个套接字绑定的这个地址端口然后将相应的数据放到这块缓冲区里面就可以了,这时候
17 //通过套接字描述符操作获取数据的时候只需要到缓冲区拿数据就可以了–网卡对内存有 18 //标识,创建套接字起始创建了一个文件描述符信息,并且在操作系统内核创建了一个结构
19 //体叫struct socket,结构体里面有两个队列一个是接收数据队列一个是发送数据队列这
20 //两个队列对应的就是缓冲区(该结构体(套接字)里面有地址信息sip sport,dip dport,)
21 //有这么多的描述信息还有一个缓冲区意味着网卡接收到数据看到该数据地址信息就放到 22 //指定缓冲区里去了—>每个套接字都有缓冲区发送和接收

int socket(int domain, int type, int protocol);
地址域:
Name Purpose Man page
AF_UNIX, AF_LOCAL Local communication(本地通信) unix(7)
AF_INET IPv4 Internet protocols(iPv4的网络协议) ip(7)
AF_INET6 IPv6 Internet protocols(iPv6的网络协议) ipv6(7)

AF_PACKET Low level packet interface(数据分用把程序层层解析,低级 packet(7)
包接口直接从网卡抓包(意味AF_PACKET接受到的数据包没有
经过数据分用过程的数据包具有以太头网络ip头,tcp/udp头,
应用头–>整体的包数据)

套接字类型
SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmis‐sion mechanism may be supported.–流式套接字–提供的是字节流服务—>用于tcp
SOCK_DGRAM Supports datagrams (connectionless, unreliable mes‐ sages of a fixed maximum length).—数据报套接字—提供用户数据报服务–>udp
协议有自己的宏—>vim /usr/include/netinet/in.h里面
可以看到
enum
42 {
43 IPPROTO_IP = 0, /* Dummy protocol for TCP. /
44 #define IPPROTO_IP IPPROTO_IP
45 IPPROTO_ICMP = 1, /

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值