【问题标题】:Can't make TCP client code work without USB cable attached在没有连接 USB 电缆的情况下无法使 TCP 客户端代码工作
【发布时间】: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


【解决方案1】:

您附近是否有连接手机的无线应用程序?因为当你将它插入电脑时,它会使用电脑的网络连接。

【讨论】:

  • 是的,手机已连接到我的 WiFi。
【解决方案2】:

您应该检查您在电话(通过您的代码)和 PC 上拥有的 IP 地址(看起来您已经在命令提示符中使用 ipconfig 找到了该地址)。

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

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

如果这是您管理的消费者路由器,则验证(并可能修复)应该相当简单。如果没有,你可能会被卡住......

【讨论】:

  • 如您所说,这很可能是连接问题。但是,手机和笔记本电脑在同一个网络上,这只能意味着路由器试图通过外部网络路由内部流量,或者类似的东西。遗憾的是,我在公司网络上,所以我无法真正验证这一点。
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2023-03-26
  • 2017-03-05
相关资源
最近更新 更多