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

C / C++ / MFC

 
QuestionTCP client/server data exchange Pin
bigdenny20014-Nov-07 9:00
bigdenny20014-Nov-07 9:00 
AnswerRe: TCP client/server data exchange Pin
Mark Salsbery14-Nov-07 9:19
Mark Salsbery14-Nov-07 9:19 
GeneralRe: TCP client/server data exchange Pin
bigdenny20014-Nov-07 10:09
bigdenny20014-Nov-07 10:09 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery14-Nov-07 10:11
Mark Salsbery14-Nov-07 10:11 
GeneralRe: TCP client/server data exchange Pin
bigdenny20014-Nov-07 10:14
bigdenny20014-Nov-07 10:14 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery14-Nov-07 10:19
Mark Salsbery14-Nov-07 10:19 
GeneralRe: TCP client/server data exchange Pin
bigdenny20014-Nov-07 11:15
bigdenny20014-Nov-07 11:15 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery14-Nov-07 11:37
Mark Salsbery14-Nov-07 11:37 
bigdenny200 wrote:
you mention,
"a fixed-length "packet" scheme"


By that, I meant, for example, a structure (which is fixed length) - since the sender sends a structure,
the receiver knows to receive sizeof(thestructure) bytes.  This is inefficient if the structure isn't always
fully used, since there will be needless extra bytes sent across the network.

bigdenny200 wrote:
The server knows it should get 3 bytes at a time. So I have

while ( i = recv(buff, 3,..) )
{...}


The problem here (that Judy was referring to) is that a recv() call is successful
even if only ONE byte is received.  Even though the sender sent 3 bytes, that doesn't
mean the receiver receives 3 bytes.  TCP guarantees you'll eventually get the 3 bytes, in order,
but there's no guarantee they will come in one call to recv().  Remember, TCP only knows bytes.

Here's an example, with some error checking, of a way to receive a known number of bytes into a BYTE buffer...
    int BytesRemaining = # of expected bytes;
    BYTE *pCurBuf = start address of buffer to recv bytes into;

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

        if (CurBytesReceived == 0)
        {
            // connection was gracefully closed

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

            int rc = WSAGetLastError();

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

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

bigdenny200 wrote:
what do you mean by: "a 4-byte int - don't forget byte order issues!"


If you ever pass multibyte integers between different platforms, you need to
worry about byte order.  For example, Intel machines store ints in memory with
the least-significant byte first.  It's opposite on non-Intel Macs.  If you stream the
4 bytes of the int from one platform to the other, the receiver needs to know to swap the
byte order before using the 4 bytes as an int.

Mark



Mark Salsbery
Microsoft MVP - Visual C++

Java | [Coffee]

GeneralRe: TCP client/server data exchange Pin
bigdenny20014-Nov-07 11:56
bigdenny20014-Nov-07 11:56 
GeneralRe: TCP client/server data exchange Pin
Mark Salsbery14-Nov-07 12:12
Mark Salsbery14-Nov-07 12:12 
GeneralRe: TCP client/server data exchange Pin
Jörgen Sigvardsson14-Nov-07 11:14
Jörgen Sigvardsson14-Nov-07 11:14 
GeneralRe: TCP client/server data exchange Pin
bigdenny20014-Nov-07 11:17
bigdenny20014-Nov-07 11:17 
GeneralRe: TCP client/server data exchange Pin
Jörgen Sigvardsson14-Nov-07 21:33
Jörgen Sigvardsson14-Nov-07 21:33 
AnswerRe: TCP client/server data exchange Pin
JudyL_MD14-Nov-07 10:03
JudyL_MD14-Nov-07 10:03 
GeneralRe: TCP client/server data exchange Pin
bigdenny20014-Nov-07 10:12
bigdenny20014-Nov-07 10:12 
GeneralRe: TCP client/server data exchange Pin
JudyL_MD14-Nov-07 10:19
JudyL_MD14-Nov-07 10:19 
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 
GeneralRe: TCP client/server data exchange Pin
JudyL_MD15-Nov-07 6:52
JudyL_MD15-Nov-07 6:52 

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.