【发布时间】:2012-01-30 15:25:10
【问题描述】:
在我的 HTC Titan w/Windows Phone 7.5 上运行一个非常简单的 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
正如我之前所说,当设备连接到我的开发机器时,代码就像一个魅力。拔下电缆后,连接阶段就会超时(不管我应该说的超时间隔如何)。
此外,清单包含 ID_CAP_NETWORKING 功能,据我了解,它应该授予应用访问网络的权限。
有什么想法吗?
编辑: 我发现切换到 UDP 通信就像一个魅力。这意味着问题是由于某种原因,手机无法建立与我的开发机器的持久 TCP 连接。这越来越陌生了。
【问题讨论】:
-
我有一个愚蠢的问题。当您插入 USB 连接时,IP 数据包是否会通过 USB 连接?如果是这样,那么您是否使用正确的地址进行非 USB(可能是 WiFi)连接?您的台式机可能为 USB 到手机的连接分配了一个与无线网络不同的地址。
-
您的机器可能对不同的网络(USB 和 Wi-Fi)使用不同的 IP。检查您的代码在断开连接时使用的是 Wi-Fi 地址而不是 USB 地址。
-
GregHewgill:是的。是的,我是。据我所知,手机插入时使用USB连接作为网络接口。但我的开发机器仍然具有相同的IP。 Strillo:地址相同。
-
@manneorama:我的意思是您的开发机器可能有多个地址。如果您在两种情况下都使用相同的 IP 地址,那么这可能是问题所在。但我不确定,因为我看不到你的设置。
标签: c# windows-phone-7