Linux Socket - UDP链接包

LINUX UDP SOCKET

01

UDP号绑定会报错吗?

会的,提示Address is using,本地的没有区别

UDP不需要发起链接,不知道是不是连接成功

client的IP地址和端口号不正确都不会报错,包一直向外抛

但是通过抓包工具,IP不正确

可以得到network unreachable的网关回答

端口不正确

可以得到对方主机拒绝端口的回答(图中端口错了)

运行终止后再次绑定端口号能否成功?

可以!因为UDP是未知状态下的抛送包,TCP下是不行的,要等握手链接告别表示已经空了可以断线,之后才能绑上,而UDP没有链接,只有包。

931955-20180304000018057-1407884773.png

阻塞接通UDP包

931955-20180304000025383-1409005952.png

在Server端kill掉进程

客户端没有任何反应

931955-20180304000042800-12657946.png

在Client端kill掉进程

服务端没有任何反应

931955-20180304000049539-2007367760.png

总结:UDP链接不锁死端口号(没有握手过程不需要确认告别),kill掉任何一段另一端都没有反应(收不到信号)

02

阻塞方法和非阻塞方法没有区别

因为UDP对网络的状态是未知的,想获得报错信息,只能在程序里想办法抓到网关或者对方主机的refused包

非阻塞方法接通socket

931955-20180304000058455-1822975800.png

03

阻塞方法一次读取20字节

读取到的内容只有20字节,每次都是前20字节

931955-20180304000106481-442758317.png

阻塞方法发送2字节//没有意义

每次都是前两字节

931955-20180304000111647-717088013.png

04

非阻塞方法法20字节

效果同阻塞方法

931955-20180304000116742-1280573802.png

非阻塞方法发送2字节//没有意义

效果同阻塞方法

931955-20180304000124496-1935106187.png

为什么UDP中缓冲区长度没有意义?

931955-20180304000130083-633339101.png

在UDP中调整缓冲区来保证字节数本身就是没有价值的

因为UDP的包本身不保证连续,不保证能够送达(送不到直接回信refused)有可能是缓冲区满,有可能丢包了。因此每个包就是一个完整的数据

931955-20180304000136949-465072838.png

05

Server端和Client端都具备双路收发

931955-20180304000141736-149079925.png

其他问题

UDP能否只绑定一个IP?

可以的,我所有的代码都是绑定第二个IP(一般第一个是回环IP,第二个是ens33通外网的IP,直接使用之前写的GET IP LIST即可

UDP Server之间能否收发数据?

可以,UDP不需要设置监听链接,没有accept和connect关系,Server和Client之间是等位的,两个Server之间也可以传递UDP包

UDP中的client端口号可以绑定吗?

可以绑定,但是没有绑定的意义。链接都不存在,指定端口也不能接听到什么内容。

UDP的端口号netstat能不能看到?

看不到的。试过无数次了,只能通过抓包工具看包的来源和去向(IP:PORT)

Client端是否一定需要connect?不使用connect的情况下有什么区别?

对于Server端来说没有区别,对于client端来说connect在自己主机给sockfd固定一个addr,这样可以直接写recv和send而不用每次都执行recvfrom和sendto。但是只影响到内核中的sockfd文件和地址族绑定,UDP协议还是UDP协议,收发包没有任何区别

持续写能否写满缓冲区?阻塞和非阻塞有区别吗?

有区别!阻塞的方法写满了缓冲区直接报错回弹了,非阻塞的一直发包,另一边缓冲区满了包直接扔了不读

UDP收发缓冲区可以设置?

可以的,setsockopt,但是没有任何价值,UDP的包本身是不连续的,除非为了接受一个硕大无比的UDP包,才去调整缓冲区,但是UDP本身丢包是不知道的,UDP包也没有长度指示符。

转载于:https://www.cnblogs.com/liutianchen/p/8503556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,使用socket函数可以创建一个UDP套接字。socket函数的原型如下:int socket(int domain, int type, int protocol)。其中,domain参数指定了套接字的协议族,对于UDP套接字,可以使用AF_INET或AF_INET6。type参数指定了套接字的类型,对于UDP套接字,需要指定为SOCK_DGRAM。protocol参数指定了使用的协议,对于UDP套接字,可以设置为0表示使用默认的协议(一般为IPPROTO_UDP)。 UDP(用户数据报协议)是一种面向非连接的传输层协议。与TCP不同,UDP不需要与对方建立连接,而是直接将数据报发送给对方。因此,UDP适用于一次传输数据量较小、对可靠性要求不高或对实时性要求较高的应用场景。UDP的通信效率较高,因为不需要建立类似三次握手的连接过程。 尽管UDP是无连接的协议,但在UDP网络编程中也存在connect函数。connect函数用于表示确定了另一方的地址,并没有其他含义。通过connect函数,在UDP编程中可以将套接字绑定到特定的远程地址,使其成为已连接的UDP套接字。这样,可以在后续的通信中使用send和recv等函数进行数据的发送和接收。需要注意的是,UDP的connect函数与TCP的connect函数并不相同。 因此,在Linux中,可以通过socket函数创建UDP套接字,并根据需要选择是否使用连接功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Linux编程之UDP](https://blog.csdn.net/u014583317/article/details/109452032)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值