udp调用sendmsg报错Invalid argument

最近在写一个udp发送的时候冒出来一个错误,errno等于22,错误描述是Invalid argument,百度之后都是一些关于文件操作的错误,最后还是要靠自己。用strace跟进内核调用过程,也是没看出来什么。这里写图片描述
可以看到,sendmsg所有参数完全正确,但是最后就是错误。
这个问题的主要点是对udp执行connect操作!connect并没有进行真正的连接操作(相对于tcp来说),而相当于给对应的套接字设置了目的地址和端口,此后对该套接字可以直接使用send,recv发送数据和接收数据。重点:同时使用sendto等指定地址发送接口的时候必须指定和connect指定的地址是同一个地址,否则协议栈会提示 Invalid argument!就是说对udp调用了connect之后,实际上限制了通讯的对象,当然你也可以多次connect,后续的connect就是改变这个地址结构的意义了。我这里代码初始化udp的时候给的地址是一个随意给的,想着后面发送的时候指定需要发送的地址就好,于是就来了这个错误!
这里说了udp的connect指定ip地址和端口作用,其实还有一个提高性能的作用,我翻了一下UNP,有详细介绍,如果使用connect来指定,同时对一个相同地址发送数据包的时候可以节约1/3的性能。
在一个未连接的udp套接字上调用sendto时,内核操作:
1.连接套接字
2.输出第一个数据报
3.断开套接字连接
4.连接套接字
5.输出第二个数据报
6.端口套接字连接
当应用进程知道自己要给同一个目的地址发送多个数据报时,显式连接套接字效率更高,内核操作:
1.连接套接字
2.输出第一个数据报
3.输出第二个数据报
内核只复制一次含有目的地址和端口号的套接字地址结构!相反调用两次sendto就需要复制两次。
最后说一下这个sendmsg,它发送多个缓冲区,我开始一直不明白这个意思,不清楚内核是怎样发送的,当然对于tcp无关紧要,毕竟是流,发一个缓冲还是多个缓冲,到了对端最后都要通过标识加长度来拆包。可是udp你就不知道一个缓冲对应一个包还是多个缓冲对应一个包了,正好UNP有说到,sendmsg是原子操作,也就是sendmsg出去的多个数据缓冲,最后对端收到的是一个完整的累加的udp包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值