Re: Making sure you receive it all



I am quite confused...here is some code with how i was going to implement
it: This is called asynchornously.
As it is called async my _totalStreamSize will continue to be set using the
first 4 bytes f the data so this obviously will not work as the next bit of
data to come through wont have the total size at the front. So whats the
best way?At which point should i store the total?


/// <summary>

/// Callback running Asynchronously firing when data received from the
server

/// </summary>

/// <param name="asyn"></param>

void OnDataReceived( IAsyncResult asyn)

{

CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;

try

{

//end receive...

int size = 0 ;

size = theSockId.thisSocket.EndReceive (asyn); //end receive on socket
passed in and return totalbytes read

_totalStreamSize = GetExpectedSize(theSockId.dataBuffer); //returns total
bytes read from first 4 bytes in buffer


if ( size == 0 )

{

theSockId.thisSocket.Close();

}

else

{

lock(this)

{

HandleDataReceived(theSockId.dataBuffer, size);

}

WaitForData();

}

}

catch(SocketException exc)

{

MessageBox.Show(exc.Message,"Failed to receive - " + exc.GetType());

theSockId.thisSocket.Close();

}

catch(Exception exc)

{

MessageBox.Show(exc.Message,"Failed to receive - " + exc.GetType());

theSockId.thisSocket.Close();

}

}


"Alexander Nickolov" <agnickolov@xxxxxxxx> wrote in message
news:OP3YlDmMGHA.3264@xxxxxxxxxxxxxxxxxxxxxxx
Not static of course - a member of your class will be much
better. And you should not reset it to zero, but subtract the
number of bytes used (you may have received more data
which you'll ingore if you reset to zero). Also, shift the remaining
data in your buffer to the beginning and store new data from
that position. Additionally, keep in mind you may get several
messages in one go, so don't stop processing after the first
message, only stop when you encounter an incomplete message.
I'm not familiar with the environment you are using (.NET and
C# would be my first guess), so can't write you sample code.

--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@xxxxxxxx
MVP VC FAQ: http://www.mvps.org/vcfaq
=====================================

"Dan" <dvazanias@xxxxxxx> wrote in message
news:%23mklovkMGHA.3496@xxxxxxxxxxxxxxxxxxxxxxx
Hey

I want to ensure i receive my full data before i process how to respond
but all the tutorials i seen use the Receive() part for the sockets.

I do whats pasted after this message, this is on the client end.

As you can see i use EndReceive(), and to be honest a little confused at
the difference compared to receive(). I presume my size int will contain
the amount of bytes read on that receive. So before calling my
HandleDataReceived method i would need to do read the first 4 bytes which
contain the length of the total data sent and check does my size received
match that, if not i do not have all the data.

So should i make a static var of totalBytesReceived and when it matches
the expected size by += it to size then do my handledatareceive() and set
my static var back to 0? I presume also then that i have to keep
appending these bytes received onto a byte array that i will then pass
through to my handle function. If so how do you append bytes? I have ben
using memory streams, doing a write and then when finished doing a
getbytes, sound acceptable?

Let me know your opinions? I presume i must do the same server side?

void OnDataReceived( IAsyncResult asyn)

{

CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;

try

{

//end receive...

int size = 0 ;

size = theSockId.thisSocket.EndReceive (asyn); //end receive on socket
passed in and return totalbytes


if ( size == 0 )

{

theSockId.thisSocket.Close();

}

else

{

lock(this)

{

HandleDataReceived(theSockId.dataBuffer, size);

}

WaitForData();

}

}

catch(SocketException exc)

{

MessageBox.Show(exc.Message,"Failed to receive - " + exc.GetType());

theSockId.thisSocket.Close();

}

catch(Exception exc)

{

MessageBox.Show(exc.Message,"Failed to receive - " + exc.GetType());

theSockId.thisSocket.Close();

}

}


--
Dan





.



Relevant Pages

  • Re: Making sure you receive it all
    ... passed in and return totalbytes read ... catch(SocketException exc) ... I presume my size int will ... I presume also then that i have to keep ...
    (microsoft.public.win32.programmer.networks)
  • Re: Making sure you receive it all
    ... passed in and return totalbytes read ... catch(SocketException exc) ... I presume my size int will ...
    (microsoft.public.win32.programmer.networks)
  • Re: Making sure you receive it all
    ... passed in and return totalbytes read ... catch(SocketException exc) ... I presume my size int will contain ... I presume also then that i have to keep ...
    (microsoft.public.win32.programmer.networks)
  • Making sure you receive it all
    ... I presume also then that i have to keep appending ... passed in and return totalbytes ... catch(SocketException exc) ...
    (microsoft.public.win32.programmer.networks)

Loading