Click here to Skip to main content
15,910,603 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
AnswerRe: ::ifstream.open behaves differently in VC6 and VS2010 Pin
CPallini30-Jan-12 22:42
mveCPallini30-Jan-12 22:42 
GeneralRe: ::ifstream.open behaves differently in VC6 and VS2010 Pin
KASR131-Jan-12 3:24
KASR131-Jan-12 3:24 
AnswerRe: ::ifstream.open behaves differently in VC6 and VS2010 Pin
Albert Holguin31-Jan-12 3:37
professionalAlbert Holguin31-Jan-12 3:37 
GeneralRe: ::ifstream.open behaves differently in VC6 and VS2010 Pin
KASR131-Jan-12 3:42
KASR131-Jan-12 3:42 
AnswerRe: ::ifstream.open behaves differently in VC6 and VS2010 Pin
Albert Holguin31-Jan-12 5:17
professionalAlbert Holguin31-Jan-12 5:17 
GeneralRe: ::ifstream.open behaves differently in VC6 and VS2010 Pin
KASR11-Feb-12 7:29
KASR11-Feb-12 7:29 
Questionbasic Winsock / IOCP / UDP question Pin
SledgeHammer0130-Jan-12 13:01
SledgeHammer0130-Jan-12 13:01 
AnswerRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt30-Jan-12 22:19
professionalJochen Arndt30-Jan-12 22:19 
UDP is connectionless, so you did not get a connect event. But you can get events when data arrives. Using one receiving thread is enough even with many clients when the UDP packets are small. A typical implementation would be:
C++
m_hevWSA = ::WSACreateEvent();
m_sockRecv = ::WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED);
::bind(m_sockRecv, reinterpret_cast<sockaddr*>(&sinRecv), sizeof(struct sockaddr));

// Worker thread
UINT CMyClass::WorkerThread(void)
{
    int nRet = -1;
    bool bPending = false;
    DWORD dwWSARead = 0;
    DWORD dwWSAFlags = 0;receive flags
    char NetBuf[DGRAM_BUF_SIZE];
    WSABUF WSABuf = { DGRAM_BUF_SIZE, NetBuf };
    HANDLE ahWait[2] = { m_evKill.m_hObject, m_hevWSA };
    WSAOVERLAPPED ovWSA;
    struct sockaddr_in SenderAddr;
    ::ZeroMemory(&SenderAddr, sizeof(SenderAddr));
    ::ZeroMemory(&ovWSA, sizeof(WSAOVERLAPPED));
    ovWSA.hEvent = m_hevWSA;
    do
    {
        int nWSAErr = 0;
        unsigned nNetRead = 0;
        if (!bPending)
        {
            dwWSARead = 0;
            dwWSAFlags = 0;
            WSABuf.len = DGRAM_BUF_SIZE;
            WSABuf.buf = NetBuf;
            int nSenderAddrSize = sizeof(SenderAddr);
            if (::WSARecvFrom(m_sockRecv, &WSABuf, 1, &dwWSARead, &dwWSAFlags,
                (SOCKADDR *)&SenderAddr, &nSenderAddrSize, &ovWSA, NULL) == 0)
            {
                nNetRead = static_cast<unsigned>(dwWSARead);
            }
            else
            {
                nWSAErr = ::WSAGetLastError();
                if (nWSAErr == WSA_IO_PENDING)
                    bPending = true;
                else
                    nRet = 1;
            }
        } // if (!m_bPending)
        switch (::WaitForMultipleObjects(bPending ? 2 : 1,
            ahWait, FALSE, bPending ? INFINITE : 0))			
        {
        case WAIT_OBJECT_0 : nRet = 0; break;
        case WAIT_OBJECT_0 + 1 :
            if (::WSAGetOverlappedResult(m_sockRecv, &ovWSA, &dwWSARead, FALSE, &dwWSAFlags))
            {
                nNetRead += static_cast<unsigned>(dwWSARead);
                bPending = false;
            }
            else
            {
                nWSAErr = ::WSAGetLastError();
                if (nWSAErr != WSA_IO_INCOMPLETE)
                    bPending = false;
            }
            ::ResetEvent(m_hevWSA);
            break;
        }
        if (nNetRead)
        {
            // process data
        }
    }
    while (nRet == -1);
    return (nRet == STILL_ACTIVE) ? 1 : static_cast<UINT>(nRet);
}

GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 5:01
SledgeHammer0131-Jan-12 5:01 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt31-Jan-12 5:51
professionalJochen Arndt31-Jan-12 5:51 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 6:27
SledgeHammer0131-Jan-12 6:27 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt31-Jan-12 6:43
professionalJochen Arndt31-Jan-12 6:43 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 6:58
SledgeHammer0131-Jan-12 6:58 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt31-Jan-12 7:14
professionalJochen Arndt31-Jan-12 7:14 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 7:19
SledgeHammer0131-Jan-12 7:19 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 14:12
SledgeHammer0131-Jan-12 14:12 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt31-Jan-12 21:25
professionalJochen Arndt31-Jan-12 21:25 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 6:52
SledgeHammer011-Feb-12 6:52 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt1-Feb-12 7:35
professionalJochen Arndt1-Feb-12 7:35 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 7:53
SledgeHammer011-Feb-12 7:53 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt1-Feb-12 8:00
professionalJochen Arndt1-Feb-12 8:00 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 8:09
SledgeHammer011-Feb-12 8:09 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 8:19
SledgeHammer011-Feb-12 8:19 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 8:31
SledgeHammer011-Feb-12 8:31 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 11:10
SledgeHammer011-Feb-12 11:10 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.