没有连接USB电缆,无法使TCP客户端代码工作

时间:2012-01-27 08:54:48

标签: c# windows-phone-7

我在使用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连接。这一刻变得越来越陌生。

2 个答案:

答案 0 :(得分:0)

您的手机附近有无线连接吗?因为当你把它插入电脑时,它会使用电脑的网络连接。

答案 1 :(得分:0)

您应该检查手机上的IP地址(来自您的代码)和PC(在您的命令提示符中使用ipconfig看起来已经找到的IP地址)。

这些应该在相同的IP地址范围内,因此从相同的数字开始(对于IPv4,可能是链接192.168.0.*)。

如果这一切都匹配,请检查您的无线路由器是否未启用安全设置,这意味着它不允许从您的手机到PC的TCP流量。

如果这是一个消费者路由器,你应该很容易验证(并可能修复)。如果没有,你可能会卡住......