2012-01-27 4 views
2

У меня возникли проблемы с получением очень простого клиента TCP, работающего на моем HTC Titan с Windows Phone 7.5.Не удается заставить TCP-клиент работать без подключенного USB-кабеля

Когда USB-кабель подключен к телефону, клиент TCP работает как шарм, но как только кабель отсоединен, клиент не может подключиться к TCP-серверу, запущенному на моей машине разработки. Устройства находятся в одной сети, и я использую явный IP-адрес своего настольного компьютера для подключения, поэтому на afaik нет разрешения имен.

Вот код, который я использую. Большая часть из них была взята из образцов Sockets на 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, которая, как я понимаю, должна предоставлять разрешение на доступ к сети.

Любые идеи?

EDIT: Я обнаружил, что переход на UDP-коммуникацию работает как шарм. Это означает, что проблема в том, что по какой-то причине телефон не может настроить постоянное TCP-соединение с моей машиной dev. С минуту это становится странным.

+0

У меня есть немой вопрос. Являются ли пакеты IP, проходящие через USB-соединение, когда вы подключены? Если да, то используете ли вы правильный адрес для подключения без USB (предположительно WiFi)? Ваш настольный компьютер может назначать себе другой адрес для соединения USB-телефон, чем для беспроводной сети. –

+0

Возможно, ваш компьютер использует разные IP-адреса для разных сетей (USB и Wi-Fi). Убедитесь, что ваш код при отключении использует Wi-Fi-адрес, а не USB-порт. – Strillo

+0

GregHewgill: Да, они есть. И да, да. Насколько я могу судить, телефон использует USB-соединение в качестве сетевого интерфейса при подключении. Но у моей машины Dev все еще есть тот же IP-адрес. Strillo: Это тот же адрес. – manneorama

ответ

0

У вас есть беспроводной ap рядом с которым ваш телефон подключен? потому что когда вы подключаете его к компьютеру, он использует сетевое соединение компьютера.

+0

Да, телефон подключен к моему WiFi. – manneorama

0

Вы должны проверить IP-адрес, который у вас есть на телефоне (от вашего кода) и на ПК (который, как вы уже нашли, использует ipconfig в командной строке).

Они должны быть в том же диапазоне IP-адресов и поэтому начинаться с одинаковых цифр (для IPv4, возможно, что-то ссылка 192.168.0.*).

Если все это соответствует проверке, ваш беспроводной маршрутизатор не включил параметр безопасности, что означает, что он не позволяет трафик TCP с вашего телефона на ваш компьютер.

Если это потребительский маршрутизатор, которым вы управляете, это должно быть довольно просто проверить (и, возможно, исправить). Если нет, вы, вероятно, застряли ...

+0

Это, по всей вероятности, проблема с подключением, как вы говорите. Однако телефон и ноутбук находятся в одной сети, что может означать только то, что маршрутизатор пытается маршрутизировать внутренний трафик через внешнюю сеть или что-то в этом роде. К сожалению, я нахожусь в корпоративной сети, поэтому я не могу это проверить. – manneorama

Смежные вопросы