有些Windows 7安装不在UdpClient.Close()上发布UDP套接字?

时间:2013-08-29 17:59:07

标签: c# windows sockets udp

同事和我在运行几乎完全相同的Windows 7安装的相同硬件上使用相同的代码。我们都在Unity3d中使用C#,以及unity3d-tuio包的最新SVN签出。 TUIO是一种基于开放声音控制的UDP协议,用于发送有关触摸屏交互的数据。在我的机器上,应用程序在我第一次运行时工作正常(虽然启动时有一个奇怪的~5秒延迟),但是随后应用程序启动时,它会引发以下异常:

SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.

System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end)
System.Net.Sockets.UdpClient.InitSocket (System.Net.EndPoint localEP)
System.Net.Sockets.UdpClient..ctor (System.Net.IPEndPoint localEP)
Tuio.TuioTracking.Start () (at Assets/Plugins/MindstormTuio/Scripts/TuioReceiver/TuioTracking.cs:70)
UnityEngine.Debug:LogException(Exception)

对于我的同事来说,启动时没有奇怪的延迟,应用程序可以根据需要重启多次,没有任何不良影响。

如果我在我的机器上运行netstat -a -n -o,我看到UDP连接 - UDP 0.0.0.0:3333 *:* 6088 - 即使在应用程序和Unity编辑器退出后也是打开的。我已经确定首次运行应用程序时运行tasklist /F "PID EQ 6088" PID(在本例中为6088)是Unity.exe(Unity编辑器)。看来,第一次执行应用程序时,Unity.exe会抓取端口3333并且不会释放它。即使退出Unity编辑器,UDP 0.0.0.0:3333 *:* 6088条目也会出现在netstat中。

似乎是我的开发机器特有的配置问题,因为我的同事的机器没有展示它。

任何想法哪些配置问题都可能导致此问题?

1 个答案:

答案 0 :(得分:0)

我不确定为什么这是解决方案,但在任务管理器中,我注意到adb.exe,Android调试桥,在我第一次启动Unity时正在运行应用程序。在我停止播放或退出Unity后它没有关闭 - 如果我强制退出adb.exe,则释放端口,并且在后续运行应用程序期间ADB不再启动。我不确定为什么当我开始在Unity中播放我的应用程序时启动ADB(它不是Android版本),所以我很困惑。如果有人了解为什么这会解决问题,请告诉我们?