Socket通讯总结

 

以下是对socket通信的总结,总结得相当好哦!

 

1、  为了增加效率,可以考虑采用无异常的函数
在.net2.0中Socket.Send,Socket.Receive 有了无异常的函数 

Socket.Send(Byte[], Int32, Int32, SocketFlags, SocketError) 
Socket.Receive(Byte[], Int32, Int32, SocketFlags, SocketError) 
减少不必要的异常,就等于增加效率。

2、Socket.Connected 不是当前的Socket状态
MSDN原文:获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。 
应当如何解决呢?

同样MSDN也告诉了我们: 
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。 如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。 
3、要用Socket.Poll判断是否可以接收,不要用Socket.Available 
虽然Socket.Available可以偷窥到当前Recv缓冲区字节数,而且Available是Poll速度的两倍,但是MSDN说到:如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。 
所以当网络断开的时候单纯使用Socket.Available判断是否recv到数据会存在不知道客户端已经断开Bug 
补充:不推荐使用Socket.Poll对Socket的列表遍历,应当使用Socket.Select(或者其他模型),Socket.Poll是对Socket.Select的封装,执行Socket.Poll耗时是非阻塞Socket.Recv的三倍。 
4、非阻塞模式不能采用Receive的返回值表示是否断开 
第3条说道:如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。但这并不能阻塞模式说明Socket已经断开,这一条和C的recv函数不同,需要特别注意。需要判断out出来的SocketError,当不为SocketError.Success、SocketError.Interrupted和SocketError.WouldBlock时就可以认为网络已经断开。 
5、Send可能出现缓冲区满的情况 
判断out出来的SocketError,如果等于SocketError.WouldBlock,则是Send缓冲区已满,应断开该Socket,否则影响整体速度,而不应当again, 反过来说允许的错误码只有SocketError.Interrupted,此时可以重来一次。 
6、主动断开Socket 
MSDN说道:如果当前使用的是面向连接的 Socket,则必须先调用 Shutdown 方法,然后才能关闭 Socket。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。 
所以,网络库的Close函数可以封装为先调用 Shutdown(SocketShutdown.Both),在调用Close()。 
7、Socket已经关闭(Close)但不能在另一端断开 
一端Scoket已经关闭了,但另一端短时间内仍可以发送数据!这个问题还没有找到解决办法的,但原因已知,在《Windows网络编程技术》一书(P139-P140)中说道:被动关闭的情况下,应用程序会从对方那里接收一个FIN包,并用一个ACK包做出响应。此时,应用程序的套接字会变成ClOSE_WAIT状态。由于对方已关闭自己的套接字,所以不能再发送数据了。但应用程序却不同,它能一直发送数据,直到对方的套接字已关闭为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ur机器人的socket通讯是指使用socket技术进行与ur机器人之间的数据传输和通信。socket通讯是一种基于TCP/IP协议的网络通信模式,在实现机器人之间的通信时,可以通过建立socket连接来进行数据的传输和交互。 使用socket通讯可以实现机器人之间的远程控制和数据传递。首先,需要在机器人端和控制端分别建立socket连接,可以是客户端-服务端的模式,也可以是双向通信的模式。通过socket连接,控制端可以发送指令给ur机器人,例如控制其移动、执行特定任务等。而机器人端则可以将执行结果或者传感器数据通过socket发送给控制端,实现信息的双向传输。 在建立socket连接后,可以使用socket的不同方法进行数据的发送和接收。例如,控制端可以使用send方法将指令数据发送给机器人端,而机器人端可以使用recv方法接收到传来的指令,然后执行相应的操作。机器人端发送数据给控制端时,也是通过send方法发送数据,控制端使用recv方法接收数据。 socket通讯的优势在于其稳定性和可靠性。通过socket连接,可以在不同的网络环境下实现机器人之间的通信,而且数据传输的延迟相对较低。此外,socket通讯还支持多机器人的连接和通信,可以实现多个机器人之间的协同工作。 总结来说,ur机器人的socket通讯是通过建立socket连接,在机器人端和控制端之间进行数据传输和通信的一种技术。它可以实现远程控制、数据传递等功能,为机器人应用提供了广阔的发展空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值