Детекшн разрыва соединения по socket при работе с iPad
От: squid_etc  
Дата: 05.02.13 11:14
Оценка:
Добрые день! С++, винда, сервер, который ждёт подключения по сокету. ко мне подключается сокет под 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.