我在使用Windows Phone 7.5的HTC Titan上运行非常简单的TCP客户端时遇到了一些麻烦。
当USB电缆连接到手机时,TCP客户端的工作方式就像魅力一样,但只要拔下电缆,客户端就无法连接到我的开发机器上运行的TCP服务器。这些设备位于同一个网络上,我使用桌面计算机的显式IP地址进行连接,因此无法解析名称解析。
这是我使用的代码。其中大部分是从MSDN上的套接字样本中获取的(但现在似乎无法找到链接)。
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连接。这一刻变得越来越陌生。
答案 0 :(得分:0)
您的手机附近有无线连接吗?因为当你把它插入电脑时,它会使用电脑的网络连接。
答案 1 :(得分:0)
您应该检查手机上的IP地址(来自您的代码)和PC(在您的命令提示符中使用ipconfig
看起来已经找到的IP地址)。
这些应该在相同的IP地址范围内,因此从相同的数字开始(对于IPv4,可能是链接192.168.0.*
)。
如果这一切都匹配,请检查您的无线路由器是否未启用安全设置,这意味着它不允许从您的手机到PC的TCP流量。
如果这是一个消费者路由器,你应该很容易验证(并可能修复)。如果没有,你可能会卡住......