c# - 如果没有连接 USB 电缆,则无法使 TCP 客户端代码工作

标签 c# windows-phone-7

我在使用 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/

相关文章:

c# - 如何避免在 appsettings.json 中存储密码或其他敏感数据

c# - Get<T> 方法如何与 DynamicParameters 一起使用?

xna - 在 XNA for Windows Phone 7 中绘制贝塞尔曲线路径

windows-phone-7 - ApplicationBar 上的按钮 (WP7)

animation - Windows Phone 7 导航动画

c# - 我的 WPF 应用程序未触发 MainWindow_Loaded

c# - 从我的时间轴返回所有推文

c# - 找不到来源,但无法搜索到部分或所有事件日志

windows-phone-7 - 在哪里查找 Windows Phone 应用程序 GUID

c# - 图片无法在 Windows Phone 7.5 上完全加载