【发布时间】:2016-03-23 19:17:12
【问题描述】:
在创建套接字并从中读取数据时,我尝试创建的 UWP 应用程序有一个奇怪的问题。这是基本场景:
_commandSocket = new StreamSocket();
await _commandSocket.ConnectAsync(new HostName("192.168.1.1"), "15740", SocketProtectionLevel.PlainSocket);
_commandOutput = _commandSocket.OutputStream;
_commandInput = _commandSocket.InputStream;
await _commandOutput.WriteAsync(initCommandBuffer);
var lengthBytes = new byte[4].AsBuffer();
await input.ReadAsync(lengthBytes, 4, InputStreamOptions.None);
etc..etc...etc...
我基本上是在打开一个套接字并向我的设备发送一个初始化命令。这个想法是它会首先将回复的长度作为 uint 发送给我。
当我在桌面上调试/运行应用程序时,这一切都运行良好,但如果我尝试在我的 Window 10 移动设备(诺基亚 930)上运行它,似乎没有读取一个字节(我试过读取 1 个字节而不是 4 个)。由于应用程序开发应该是“通用的”并且它在我的桌面上完美运行,我不知道从哪里开始解决这个问题。
在移动设备上打开连接有效,发送初始化命令时我也没有收到任何错误,它只是一直阻塞等待 ReadAsync 命令(好像什么都没有发回)。
我对要连接的设备没有任何影响,但同样,因为这一切都在桌面上完美运行,并且设备不知道是谁在问我,所以我很无能。
【问题讨论】:
-
远程设备是否有可能一次只允许一个连接(您的桌面)而忽略电话? (尝试从另一个桌面运行以验证)。此外,手机可能正在尝试使用蜂窝网络而不是 WiFi(只是猜测 - 尝试关闭蜂窝数据)。
-
该设备肯定一次只允许一个连接,但没有其他设备尝试连接它。如果不允许我连接到它,我也会期望打开套接字时出错。出于同样的原因,我也不认为打开蜂窝网络会产生任何影响,但我今晚会试试看。
-
老兄!太疯狂了。关闭蜂窝 (4G) 网络,只保留 WiFi 就可以了。我现在仍然不明白的是,仅打开 4G 并关闭 WiFi 我仍然可以连接到 192.168.1.1。在那种情况下我连接到什么!?!?那是4G网络上的本地地址???剩下要做的一件事:如何强制我的程序使用 WiFi 而不是 4G 连接?
-
不知道我在 4G 网络上连接到 192.168.1.1 的内容,但使用 var profiles = NetworkInformation.GetConnectionProfiles(); var wifiProfile = profiles.ToArray().First(p => p.IsWlanConnectionProfile); _networkAdapter = wifiProfile.NetworkAdapter;我得到了可以传递到流套接字的 NetworkAdapter。这一切都可以通过搜索 SSID 或我猜的东西来完成,但这是以后要弄清楚的事情。现在这个问题解决了!谢谢!
-
很高兴它成功了。我不知道神奇的蜂窝网络使用什么:-)
标签: win-universal-app windows-10-universal asyncsocket windows-10-mobile