
估计你是用的tcp
socket,导致“videlord”网友说的情况:对于tcp
socket,send与recv不是对等的,recv时只要缓冲有数据就会收上来。简单说就是你send
4次,比如分别为10
10
10
10字节,对端可以一次recv到这40字节数据,也可以recv
40次、每次1字节。
解决办法有两种:
1
改用udp
socket,send/recv自然对等了
2
继续用tcp
socket,自己进行数据分段:比如自行约定在数据前约定4个字节用于描述数据长度,这样发送时,send
4+33字节,send
4+35字节;接收时,先获取描述长度的4字节获得长度,再按照长度
接收数据
(可能需要多次recv凑齐指定长度)。
socket的send和recv是同时支持TCP和UDP的。从这两个函数的设计可以看出,协议简单来说就是读写数据。
socket的选项是 SOCK_STREAM 。
send的返回值>0时,表示实际发送了多少字节。 注意: 只是copy到系统缓存里,系统决定什么时候会发送这些数据。
send的返回值==0时,这个在send空串时会发生,是正常的。
send的返回值<0时(只会等于-1吧),需要检查errno,当 errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN 时,连接正常,可以稍后再试。其他的就是连接异常了。
recv的返回值>0时,表示实际接受到多少字节。
recv的返回值==0时, 表示连接断开 ,也就是收到了FIN或者RST。
recv的返回值<0时,检查errno,和send类似。
socket的选项是 SOCK_DGRAM 。
send的返回值>0时, 返回值应该等于发送的数据长度 。如果send的数据大于MTU,会在IP层分片,到达目标机器后IP层重组。
send的返回值==0时,这个只在发送空串时出现。 注意: 真的会发送空数据的。
send的返回值<0时,检查errno,确定连接是否还正常。一般不会发生吧,UDP的send是直接发送出去的。
recv的返回值>0时, 收到一个完整的数据包 。这个完整性是有IP层保证的。
recv的返回值==0时, 收到空包,这和TCP有很大不同 。
recv的返回值<0时,检查errno,确定socket是否正常。
PS: UDP还有两个函数 sendto 和 recvfrom 。客户端在调用connect后,才能用 send 和 recv , 服务器端只能用 sendto 和 recvfrom 。
UDP无连接,无顺序,自然不能代替TCP。
TCP是流式协议,需要应用层确认数据是否接受完整,也不能代替UDP。
应用要同时支持两种协议,得在上层做包装。有个KCP,使用UDP模拟TCP。
以上就是关于c# UdpClient 接收方如何获取发送方的IP全部的内容,包括:c# UdpClient 接收方如何获取发送方的IP、如何用python获取websocket数据、Linux C语言 C/S程序,客户端发送的数据和服务器端接收到的数据不一样,求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)