Я написал небольшое клиентское приложение C / C ++ для Windows Mobile 6.5, которое подключается к серверу и отправляет некоторые данные на этот сервер. Сервер находится в моей внутренней беспроводной сети и не может быть подключен снаружи.
Странное поведение у меня:
1) Даже если WIFI не запущен на моем мобильном устройстве, connect () из клиентского приложения возвращает успех (! = SOCKET_ERROR), но это не тот случай, когда сервер перезапускается только в беспроводной сети. сеть.
2) Если WIFI не запущен на моем мобильном устройстве, если между connect () и send () существует Sleep (1000), то send () завершается неудачно с WSAECONNRESET, НО, если Sleep отсутствует ( ) между connect () и send () успешно выполняется send ()! (только когда я выполняю read (), я наконец получаю ошибку WSAECONNRESET).
Может кто-нибудь, пожалуйста, укажите мне несколько советов, почему у меня такое поведение. Это довольно страшно, что, не имея возможности добраться до сервера, я все равно получаю успех для connect () и send (): (
По запросу, вот пример кода:
#include <windows.h>
#include <Winsock2.h>
#include "dbgview.h"
# define FxMemZero(buf,len) RtlZeroMemory ((VOID*)(buf),(SIZE_T)(len))
# define FxMemCopy(dst,src,len) RtlCopyMemory ((VOID*)(dst),(CONST VOID*)(src),(SIZE_T)(len))
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
SOCKET proxy_connection;
WSADATA wsadata;
if( 0 != WSAStartup (MAKEWORD(1, 1), &wsadata))
return -1;
proxy_connection = WSASocket (AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
if(proxy_connection == INVALID_SOCKET) {
// error creating the socket
DbgViewTraceError((L"main", L"error creating socket."));
return -1;
}
// try to connect
UINT proxy_ip_ = 0x00000000;
CHAR* proxy_0_ = "192.168.1.105";
UINT proxy_port = 3100;
// get the proxy ip
{
struct hostent *he_;
if((he_ = gethostbyname(proxy_0_)) == NULL) {
DbgViewTraceWarning((L"main", L"error %d resolving hostname %hs", WSAGetLastError(), proxy_0_));
return -1;
}
FxMemCopy((PBYTE)&proxy_ip_, (PBYTE)he_->h_addr, he_->h_length);
}
// prepare the connection data
sockaddr_in saddr_;
FxMemZero(&saddr_,sizeof(sockaddr_in));
saddr_.sin_family = AF_INET;
saddr_.sin_addr.S_un.S_addr = proxy_ip_;// address
saddr_.sin_port = htons((USHORT)proxy_port);
// do the conection
if(SOCKET_ERROR == connect(proxy_connection, (SOCKADDR*) &saddr_, sizeof(saddr_))) {
// error connecting to the proxy
DbgViewTraceWarning(( L"main", L"error %d connecting to %hs:%d", WSAGetLastError(), proxy_0_, proxy_port));
closesocket(proxy_connection);
proxy_connection = INVALID_SOCKET;
return -1;
}
DbgViewTraceInfo(( L"main", L"SUCCESS. connected to %hs:%d.", proxy_0_, proxy_port));
CHAR* buffer_ = "Momo";
UINT count_ = strlen(buffer_);
DWORD total_ = 0;
DWORD sent_ = 0;
while(total_ < count_) {
// ISSUE: IF the WIFI is not started on the mobile, the connect returns success AND the send() returns success, even though with putty
// on the mobile, a telnet on 192.168.1.105:3100 will fail with: "Network error: Connection reset by peer"
// IF I add a long-enough Sleep() between the connect() and the send(), the send() will fail with: WSAECONNRESET
//Sleep(5000);
if(SOCKET_ERROR == (sent_ = send(proxy_connection, (const char*)buffer_ + total_, count_ - total_, 0))) {
// error sending data to the socket
DbgViewTraceError((L"main", L"error %d sending data to proxy", WSAGetLastError()));
return -1;
}
total_ += sent_;
}
DbgViewTraceInfo((L"main", L"send() SUCCESS"));
return 0;
}
Результаты:
1) Без сна ():
main [INFO] УСПЕХ. подключен к 192.168.1.105:3100.
main [INFO] send () УСПЕХ
2) со сном ():
main [INFO] УСПЕХ. подключен к 192.168.1.105:3100.
основная [ОШИБКА] ошибка 10054 при отправке данных на прокси
Итак, вопросы:
1) Почему connect () завершается успешно? Как я могу быть уверен, что на самом деле существует реальное соединение?
2) Почему send () завершается успешно?
3) Почему при использовании Sleep () между connect () и send () поведение отличается?
Кажется, проблема в ActiveSync. Если ActiveSync запущен, я получаю описанное выше поведение (connect () и send () сообщают об успешном завершении, даже если это не так). Если ActiveSync не запущен, gethostbyname () завершается с ошибкой:
что правильно!
Как это может быть? Что делает ActiveSync, что все разрушает? Как я могу избежать этой проблемы? Я имею в виду, я не могу быть уверен, что пользователь запускает мое приложение, когда не работает ActiveSync, так что я могу сделать, чтобы избежать такого поведения, когда ActiveSync работает?
Thx,
MeCoco