У меня возникли проблемы с получением очень простого клиента 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. С минуту это становится странным.
У меня есть немой вопрос. Являются ли пакеты IP, проходящие через USB-соединение, когда вы подключены? Если да, то используете ли вы правильный адрес для подключения без USB (предположительно WiFi)? Ваш настольный компьютер может назначать себе другой адрес для соединения USB-телефон, чем для беспроводной сети. –
Возможно, ваш компьютер использует разные IP-адреса для разных сетей (USB и Wi-Fi). Убедитесь, что ваш код при отключении использует Wi-Fi-адрес, а не USB-порт. – Strillo
GregHewgill: Да, они есть. И да, да. Насколько я могу судить, телефон использует USB-соединение в качестве сетевого интерфейса при подключении. Но у моей машины Dev все еще есть тот же IP-адрес. Strillo: Это тот же адрес. – manneorama