Детекшн разрыва соединения по 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.
Re: Детекшн разрыва соединения по socket при работе с iPad
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 05.02.13 11:46
Оценка:
А что тебе приходит в случае с iOs? Вообще тишина? В принципе, при разрыве соединения, получение информации о разрые не гарантируется. Помнится, у нас тут даже статья на этот счет лежит
Автор(ы): Андрей Елсуков
Дата: 03.10.2004
В статье рассматривается один из способов контроля над работоспособностью TCP/IP-соединения под Windows – создание keep-alive таймера.

.
Re[2]: Детекшн разрыва соединения по socket при работе с iPad
От: squid_etc  
Дата: 05.02.13 12:23
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>А что тебе приходит в случае с iOs? Вообще тишина? В принципе, при разрыве соединения, получение информации о разрые не гарантируется. Помнится, у нас тут даже статья на этот счет лежит
Автор(ы): Андрей Елсуков
Дата: 03.10.2004
В статье рассматривается один из способов контроля над работоспособностью TCP/IP-соединения под Windows – создание keep-alive таймера.

.


Спасибо! проштудирую!
Re: Детекшн разрыва соединения по socket при работе с iPad
От: SkyDance Земля  
Дата: 15.02.13 05:04
Оценка:
_>nResult возвращает значение 0 при разрыве соединения и при закрытии самого приложения, которое подключилось по сокету(в случае клиента по Win).

ЕМНИП 0 возвращается только в случае обнаружения пропадания соединения. Соединение может закрываться разными способами — контролируемо (graceful disconnect, когда обе стороны обменяются FIN), аварийно (non-graceful, получив RST).

_>если же клиент под iOS — то под студией под дебагом — я отлавливаю убивание приложение на iPad(мне приходит nResult равный 0 или -1, не помню точно), но когда я работаю под тем же дебагом, но не приаттаченый к процесу, который работает с сокетом — разрыв не детектится.


Не совсем понятно, что где к чему приаттачено, но, вероятно, поведение системы без дебаггера и с дебаггером отличается. Можно предположить, что в одном случае RST посылается, в другом — нет, и порушенное соединение будет обнаружено только тогда, когда в него "живой" конец захочет что-то отправить.

PS: для корректной работы с ресурсами библиотеки C при запуске новых потоков рекомендуется beginthread/beginthreadex, но не CreateThread.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.