我在使用 Windows Phone 7.5 的 HTC Titan 上运行一个非常简单的 TCP 客户端时遇到了一些麻烦。
当 USB 数据线连接到手机上时,TCP 客户端工作得很好,但是一旦拔下数据线,客户端就无法连接到我的开发机器上运行的 TCP 服务器。这些设备在同一个网络上,我使用台式机的显式 IP 地址进行连接,因此 afaik 没有名称解析。
这是我使用的代码。其中大部分取自 MSDN 上的 Sockets 示例(虽然现在似乎找不到链接)。
private Socket _sock = null;
private ManualResetEvent _done = new ManualResetEvent(false);
private const int TIMEOUT = 5000;
//connect to server
public string Connect(string ip, int port) {
string result = string.Empty;
var host = new IPEndpoint(IPAddress.Parse(ip), port);
_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_sock.SetNetworkRequirement(NetworkSelectionCharacteristics.NonCellular);
var args = new SocketAsyncEventArgs();
args.RemoteEndPoint = host;
args.Completed += new EventHandler((s,e) => {
result = e.SocketError.ToString();
_done.Set();
});
_done.Reset();
_sock.ConnectAsync(args);
_done.WaitOne(TIMEOUT);
return result;
}
//send message
public string Send(string msg) {
string response = "Operation timeout";
if (_sock != null) {
var args= new SocketAsyncEventArgs();
args.RemoteEndPoint = _sock.RemoteEndPoint;
args.Completed += new EventHandler(s, e) => {
response = e.SocketError.ToString();
_done.Set();
});
var payload = Encoding.UTF8.GetBytes(data);
args.SetBuffer(payload, 0, payload.Length);
_done.Reset();
_sock.SendAsync(args);
_done.WaitOne(TIMEOUT);
}
return response;
}
//receive message
public string Receive() {
string response = "Operation timeout";
if (_sock != null) {
var args= new SocketAsyncEventArgs();
args.RemoteEndPoint = _sock.RemoteEndPoint;
args.SetBuffer(new Byte[MAX_BUFSIZE], 0, MAX_BUFSIZE);
args.Completed += new EventHandler((s,e) => {
if (e.SocketError == SocketError.Success) {
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response = response.Trim('\0');
}
else {
response = e.SocketError.ToString();
}
_done.Set();
});
_done.Reset();
_sock.ReceiveAsync(args);
_done.WaitOne(TIMEOUT);
}
return response;
}
然后简单地使用代码如下:
Connect(...);
Send(...);
Receive(...);
//and then close the socket
正如我之前所说,当设备连接到我的开发机器时,代码就像一个魅力。当电缆被拔掉时,连接阶段就会超时(不管我应该说的超时间隔是多少)。
此外, list 包含 ID_CAP_NETWORKING 功能,据我所知,它应该授予应用访问网络的权限。
有什么想法吗?
编辑: 我发现切换到 UDP 通信非常有效。这意味着问题是由于某种原因,手机无法与我的开发机器建立持久的 TCP 连接。这越来越陌生了。
最佳答案
您附近是否有连接手机的无线接入点?因为当您将它插入电脑时,它会使用电脑的网络连接。
关于c# - 如果没有连接 USB 电缆,则无法使 TCP 客户端代码工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9030883/