c# UdpClient 接收方如何获取发送方的IP

c# UdpClient 接收方如何获取发送方的IP,第1张

估计你是用的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程序,客户端发送的数据和服务器端接收到的数据不一样,求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9597472.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存