Добрые день! С++, винда, сервер, который ждёт подключения по сокету. ко мне подключается сокет под iOS с iPad-девайса.
Инициализирую сокет.
HRESULT CMyClass::InitServerSocketForEventsReceiving()
{
WSADATA wsaData;
sockaddr_in local;
WORD wVersionRequested = MAKEWORD(2, 2);
int wsaret = WSAStartup( wVersionRequested, &wsaData);
if(wsaret!=0)
{
return E_FAIL;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)m_lPortForTcpConnection + 2);
m_socketServerForConnectClientForEventsReceiving = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_socketServerForConnectClientForEventsReceiving == INVALID_SOCKET)
{
return E_FAIL;
}
if(bind(m_socketServerForConnectClientForEventsReceiving, (sockaddr*)&local, sizeof(local)) != 0)
{
return E_FAIL;
}
if(listen(m_socketServerForConnectClientForEventsReceiving, 10) != 0)
{
return E_FAIL;
}
return S_OK;
}
ожидаю подключения
HRESULT CMyClass::WaitForConnectionFromiPadClientForEventsReceiving()
{
sockaddr_in from;
int fromlen=sizeof(from);
m_socketForEventsReceiving = accept(m_socketServerForConnectClientForEventsReceiving, (struct sockaddr*)&from, &fromlen);
m_hThreadReceivingMessagesFromiPad = ::CreateThread(NULL, 0, ThreadReceivingMessagesFromiPad, this, 0, &m_dwThreadIdReceivingMessagesFromiPad);
return S_OK;
}
обрабатываю все сообщения, которые приходят от сокета в отдельном потоке
DWORD CMyClass::ThreadReceivingMessagesFromiPad(void* pVoid)
{
CMyClass *pThis = (CMyClass*) pVoid;
while(true)
{
Sleep(5);
char cReceivedData[4096];
int nResult = 0;
//we wait here for new messages from socket from another PC
nResult = recv(pThis->m_socketForEventsReceiving, cReceivedData, 4096, 0);
if (nResult == 0 || nResult == -1)//-1
{
//inform other objects about disconnect from socket
return E_FAIL;
}
cReceivedData[nResult] = '\0';
CString csMessage(cReceivedData);
if (nResult != 0)
{
// process text data received from socket
}
}
return S_OK;
}
в случае работы с сокет-клиентом под виндой
nResult = recv(pThis->m_socketForEventsReceiving, cReceivedData, 4096, 0);
nResult возвращает значение 0 при разрыве соединения и при закрытии самого приложения, которое подключилось по сокету(в случае клиента по Win).
если же клиент под iOS — то под студией под дебагом — я отлавливаю убивание приложение на iPad(мне приходит nResult равный 0 или -1, не помню точно), но когда я работаю под тем же дебагом, но не приаттаченый к процесу, который работает с сокетом — разрыв не детектится.
Спасибо за помощь!
может этот пост нужно было писать в ветке "Разработка для Mac OS и iOS", но праграмма все же под виндой а не iOS.
А что тебе приходит в случае с iOs? Вообще тишина? В принципе, при разрыве соединения, получение информации о разрые не гарантируется. Помнится, у нас тут даже статья на этот счет
лежитАвтор(ы): Андрей Елсуков
Дата: 03.10.2004
В статье рассматривается один из способов контроля над работоспособностью TCP/IP-соединения под Windows – создание keep-alive таймера.
.
Здравствуйте, kaa.python, Вы писали:
KP>А что тебе приходит в случае с iOs? Вообще тишина? В принципе, при разрыве соединения, получение информации о разрые не гарантируется. Помнится, у нас тут даже статья на этот счет лежитАвтор(ы): Андрей Елсуков
Дата: 03.10.2004
В статье рассматривается один из способов контроля над работоспособностью TCP/IP-соединения под Windows – создание keep-alive таймера.
.
Спасибо! проштудирую!