Click here to Skip to main content
16,019,843 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
GeneralRe: TCP client/server data exchange Pin
Jörgen Sigvardsson14-Nov-07 11:16
Jörgen Sigvardsson14-Nov-07 11:16 
GeneralRe: TCP client/server data exchange Pin
bigdenny20014-Nov-07 11:19
bigdenny20014-Nov-07 11:19 
GeneralRe: TCP client/server data exchange Pin
Jörgen Sigvardsson14-Nov-07 21:35
Jörgen Sigvardsson14-Nov-07 21:35 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery14-Nov-07 11:41
Mark Salsbery14-Nov-07 11:41 
GeneralRe: TCP client/server data exchange Pin
JudyL_MD15-Nov-07 3:03
JudyL_MD15-Nov-07 3:03 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery15-Nov-07 5:43
Mark Salsbery15-Nov-07 5:43 
GeneralRe: TCP client/server data exchange Pin
JudyL_MD15-Nov-07 6:01
JudyL_MD15-Nov-07 6:01 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery15-Nov-07 6:30
Mark Salsbery15-Nov-07 6:30 
Well Judy, I had to test this before I respectfully disagreed with you Smile | :)

I respectfully disagree... A blocking Recv() WILL return before all bytes requested are
received. 

Here's the test I did - note I try to recv 512 bytes but only send 256...
<font color="Green">//----------------------------------------------
// Listener/ receiver thread (started in CMYTestDlg::OnOK() below)</font>
<font color="Green">//----------------------------------------------
</font>UINT __cdecl TestThreadProc( LPVOID pParam )
{
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) 
    {
        return 1;
    }

    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(2460);

    if (bind( ListenSocket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR) 
    {
        closesocket(ListenSocket);
        return 1;
    }

    if (listen( ListenSocket, 1 ) == SOCKET_ERROR) 
    {
        closesocket(ListenSocket);
        return 1;
    }

    SOCKET AcceptSocket;

    AcceptSocket = accept( ListenSocket, NULL, NULL );
    if (AcceptSocket == INVALID_SOCKET) 
    {
        closesocket(ListenSocket);
        return 1;
    } 


    BYTE *pBuf = new BYTE[512];
    BYTE *pCurBuf = pBuf;
    int BytesRemaining = 512;

    while (BytesRemaining > 0)
    {
        int CurBytesReceived = ::recv(AcceptSocket, (char*)pCurBuf, BytesRemaining, 0);

        if (CurBytesReceived == 0)  <font color="Red">//<-- put a breakpoint here - 256 bytes will be received</font>
        {
            // connection was gracefully closed

            break;
        }
        else if (CurBytesReceived == SOCKET_ERROR)
        {
            // Some error occurred!

            int rc = WSAGetLastError();

            if (rc != WSAEWOULDBLOCK)
            {
                break;
            }
        }
        else
        {
            // Some bytes were successfully received

            BytesRemaining -= CurBytesReceived;
            pCurBuf += CurBytesReceived;
        }
    }

    delete[] pBuf;


    closesocket(AcceptSocket);
    closesocket(ListenSocket);

    return 0;
}


<font color="Green">//----------------------------------------------
// Sender (on UI thread)
//----------------------------------------------</font>
void CMYTestDlg::OnOK()
{
    AfxBeginThread(&TestThreadProc, NULL);
    ::Sleep(1000); <font color="Red">//<--hehe DON'T DO THIS IN REAL LIFE - this is JUST A TEST LOL</font>


    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) 
    {
        return;
    }

    sockaddr_in clientService; 
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 2460 );

    if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) 
    {
        return;
    }


    BYTE *pBuf = new BYTE[512];

    send(ConnectSocket, (const char *)pBuf, 256, 0);

    delete[] pBuf;


    ::MessageBox(*this, _T("Waiting for socket receive :-P"), _T("Waiting"), MB_OK);

    closesocket(ConnectSocket);

    return;
}

I had to know before I changed the way I answer socket questions here - I'm nuts like that Smile | :)

Cheers,
Mark




Mark Salsbery
Microsoft MVP - Visual C++

Java | [Coffee]

GeneralRe: TCP client/server data exchange Pin
JudyL_MD15-Nov-07 6:52
JudyL_MD15-Nov-07 6:52 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery15-Nov-07 7:10
Mark Salsbery15-Nov-07 7:10 
GeneralRe: TCP client/server data exchange Pin
JudyL_MD15-Nov-07 7:25
JudyL_MD15-Nov-07 7:25 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery15-Nov-07 7:36
Mark Salsbery15-Nov-07 7:36 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery15-Nov-07 7:14
Mark Salsbery15-Nov-07 7:14 
GeneralRe: TCP client/server data exchange Pin
JudyL_MD15-Nov-07 7:27
JudyL_MD15-Nov-07 7:27 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery15-Nov-07 7:36
Mark Salsbery15-Nov-07 7:36 
GeneralRe: TCP client/server data exchange Pin
JudyL_MD15-Nov-07 2:59
JudyL_MD15-Nov-07 2:59 
QuestionWeird namespace alias resolution problem in VC++ 2003 Pin
Orhun Birsoy14-Nov-07 8:42
Orhun Birsoy14-Nov-07 8:42 
AnswerRe: Weird namespace alias resolution problem in VC++ 2003 Pin
Mark Salsbery14-Nov-07 9:30
Mark Salsbery14-Nov-07 9:30 
AnswerRe: Weird namespace alias resolution problem in VC++ 2003 [modified] Pin
snowfall114-Nov-07 16:39
snowfall114-Nov-07 16:39 
QuestionAppoint help: [modified] Pin
Hakan Bulut14-Nov-07 6:37
Hakan Bulut14-Nov-07 6:37 
AnswerRe: Appoint help: Pin
Janzen14-Nov-07 7:14
Janzen14-Nov-07 7:14 
GeneralRe: Appoint help: Pin
Hakan Bulut14-Nov-07 7:34
Hakan Bulut14-Nov-07 7:34 
GeneralRe: Appoint help: Pin
led mike14-Nov-07 7:48
led mike14-Nov-07 7:48 
GeneralRe: Appoint help: Pin
Mark Salsbery14-Nov-07 8:02
Mark Salsbery14-Nov-07 8:02 
GeneralRe: Appoint help: Pin
Hakan Bulut14-Nov-07 8:05
Hakan Bulut14-Nov-07 8:05 

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.