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

C# 如果没有连接USB电缆,则无法使TCP客户端代码正常工作,c#,windows-phone-7,C#,Windows Phone 7,在HTC Titan w/Windows Phone 7.5上运行一个非常简单的TCP客户端时,我遇到了一些麻烦 当USB电缆连接到手机时,TCP客户端就像一个魔咒一样工作,但一旦拔下电缆,客户端就无法连接到我的开发机器上运行的TCP服务器。这些设备都在同一个网络上,我使用桌面计算机的显式IP地址进行连接,因此没有进行名称解析 这是我使用的代码。大部分是从MSDN上的套接字样本中获取的,但现在似乎找不到链接 private Socket _sock = null; private Manual

在HTC Titan w/Windows Phone 7.5上运行一个非常简单的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_网络功能,据我所知,它应该授予应用程序访问网络的权限

有什么想法吗

编辑:
我发现切换到UDP通信就像一种魅力。这意味着问题在于,由于某种原因,手机无法建立到我的开发机器的持久TCP连接。这一点越来越奇怪了。

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

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

您应该从代码中检查手机上的IP地址,以及您在命令提示符下使用ipconfig找到的pc上的IP地址

它们应该在相同的IP地址范围内,因此IPv4的起始数字应该相同,可能是192.168.0.*的链接

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


如果这是一个消费者路由器,你管理这应该是相当简单的验证和潜在的修复。如果没有,您可能被卡住了…

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

它们应该在相同的IP地址范围内,因此IPv4的起始数字应该相同,可能是192.168.0.*的链接

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


如果这是一个消费者路由器,你管理这应该是相当简单的验证和潜在的修复。如果没有,你可能被卡住了…

我有一个愚蠢的问题。插入USB连接后,IP数据包是否会通过USB连接?如果是这样,那么您是否为非USB连接(可能是WiFi连接)使用了正确的地址?您的桌面计算机可能为自己分配了一个不同于无线网络的USB到电话连接地址。您的计算机可能为不同的网络USB和Wi-Fi使用不同的IP。检查断开连接时您的代码是否使用Wi-Fi地址而不是USB地址。GregHewgill:是的。是的,我是。据我所知,手机在插入时使用USB连接作为网络接口。但是我的开发机器仍然有相同的IP。斯特里洛:是同一个地址。@manneorama:我的观点是,你的开发机器可能有多个地址。如果您在两种情况下使用相同的IP地址,那么这可能就是问题所在。但我不确定,因为我看不到你的设置。我有一个愚蠢的问题。插入USB连接后,IP数据包是否会通过USB连接?如果是这样,那么您是否为非USB连接(可能是WiFi连接)使用了正确的地址?您的桌面计算机可能为自己分配了一个不同于无线网络的USB到电话连接地址。您的计算机可能为不同的网络USB和Wi-Fi使用不同的IP。检查断开连接时您的代码是否使用Wi-Fi地址而不是USB地址。GregHewgill:是的。是的,我是。据我所知,手机在插入时使用USB连接作为网络接口。但是我的开发机器仍然有相同的IP。斯特里洛:是同一个地址。@manneorama:我的观点是,你的开发机器可能有多个地址。如果您在两种情况下使用相同的IP地址,那么这可能就是问题所在。但我不确定,因为我看不到你的设置。是的,手机连接到我的WiFi。是的,手机连接到我的WiFi。正如你所说,很可能是连接问题。然而,手机和笔记本电脑在同一个网络上,这只能意味着路由器正在尝试
通过外部网络或类似的方式路由内部流量。可悲的是,我在一个公司网络上,所以我无法真正验证这一点。正如你所说,这很可能是一个连接问题。然而,手机和笔记本电脑在同一个网络上,这只能意味着路由器试图通过外部网络或类似的方式路由内部流量。遗憾的是,我在一个公司网络上,所以我无法真正验证这一点。