Valhalla Legends Archive

Programming => General Programming => Topic started by: DarkDarkDark on February 27, 2010, 03:48 PM

Title: MBNCSUtil.BncsReader problem
Post by: DarkDarkDark on February 27, 2010, 03:48 PM
Hello I'm trying to use the MBNCSUtil.BncsReader with my data buffer but I'm stuck after messing around with it.


Dim format As MBNCSUtil.BncsReader = New MBNCSUtil.BncsReader(buffer)


However I get a "Arithmetic operation resulted in an overflow". The data buffer only contains the ping pocket. (8 bytes long: 225, 37, 8, 0, 41, 47, 146, 76)

It also happens with the SIDAUTHCHECK pocket, which is 9 or 8 bytes long.


Thanks for any help.
Title: Re: MBNCSUtil.BncsReader problem
Post by: MyndFyre on February 27, 2010, 04:28 PM
I'm not able to reproduce this error.  What version of mbncsutil.dll are you using?


        static void Main(string[] args)
        {
            byte[] sampleBuffer = new byte[] { 255, 37, 8, 0, 41, 47, 146, 76 };
            BncsReader reader = new BncsReader(sampleBuffer);
            int ping = reader.ReadInt32();
        }
Title: Re: MBNCSUtil.BncsReader problem
Post by: DarkDarkDark on February 27, 2010, 08:09 PM
hmmm the MBNCSUtil-2.1.7.22-fre.zip on your google site.

I just re-downloaded and re-referenced it but that didn't work. Another example: (255,37,8,0,88,19,21,14)

all I'm doing it rediming my buffer, getting the data and making the bncsreader:


databuffer(7) 'function
client.BeginReceive(buffer, 0, 8, SocketFlags.None, AddressOf ReceiveCallback, buffer)
Dim format1 As MBNCSUtil.BncsReader = New MBNCSUtil.BncsReader(buffer)


I also tried what you did and it worked, however with my main example (above) when I set a break point on it, it'll work. When I set a break point in a different sub it doesn't work.
Title: Re: MBNCSUtil.BncsReader problem
Post by: MyndFyre on February 27, 2010, 10:26 PM
I don't know what "databuffer(7)" means (since it's not referenced anywhere), and then you call BeginReceive which is a non-blocking call, then instantiate BncsReader with what is probably an empty receive buffer.

Do you mind posting more complete code?  It's not like anyone's going to steal it....
Title: Re: MBNCSUtil.BncsReader problem
Post by: MyndFyre on February 28, 2010, 01:11 AM
Yes, I am correct.  Here is sample code.  I used VB to verify it wasn't just a VB issue:

   Sub Main()
       Dim sampleBuffer(7) As Byte
       sampleBuffer(0) = 255
       sampleBuffer(1) = 37
       sampleBuffer(2) = 8
       sampleBuffer(3) = 0
       sampleBuffer(4) = 41
       sampleBuffer(5) = 47
       sampleBuffer(6) = 146
       sampleBuffer(7) = 76
       Dim rdr As New BncsReader(sampleBuffer)
       Dim ping As Integer = rdr.ReadInt32()
       Console.WriteLine("{0:x8}", ping)
   End Sub


This works correctly.  Now, if I try to initialize with an empty array, like so, I get an OverflowException:

   Sub Main()
       Dim buffer2(10) As Byte ' Contains all 0s because it has no data
       Dim rdr2 As New BncsReader(buffer2)
   End Sub


This points to an error in MBNCSUtil, but not the one that you think.  I should be checking the length parameter of the DataReader(Stream, int) constructor:

       public DataReader(Stream str, int length)
       {
           if (str == null)
               throw new ArgumentNullException(Resources.param_str, Resources.streamNull);

           int moreDataLen = length;
           int curIncIndex = 0;
           m_data = new byte[moreDataLen]; // the exception is here, moreDataLen = -4

So, you'd be getting an ArgumentOutOfRangeException instead of an OverflowException.  It still means you need to fix your code.  :P
Title: Re: MBNCSUtil.BncsReader problem
Post by: DarkDarkDark on February 28, 2010, 11:12 AM
Well first off I'm sorry for not giving the code, I forgot to provide it. So here's my code:


Public buffer() As Byte 'Main Buffer

Public Sub SIDPING(ByVal client As Socket, ByRef SID_PING As SID_PING)

        'Redim the buffer for 8 and receive the data
        databuffer(7)

        client.BeginReceive(buffer, 0, 8, SocketFlags.None, AddressOf ReceiveCallback, buffer)

        Dim bncreader As New MBNCSUtil.BncsReader(buffer)

        SID_PING.ping = bncreader.ReadUInt32

    End Sub

Public Function databuffer(ByVal n As Integer)
        ReDim buffer(n)

End Function 'Redim DataBuffer


It is a OverflowException, however my buffer isn't empty.

Title: Re: MBNCSUtil.BncsReader problem
Post by: MyndFyre on February 28, 2010, 03:19 PM
Yes, it is.  It's empty because BeginReceive is non-blocking.  Your thread continues execution, immediately creating the BncsReader.  But your buffer hasn't gotten any data in it.

If you replace your BeginReceive call with Receive, I guarantee that you won't have this problem.  You'll have other problems (UI blocking, for instance), but you won't have a problem with the data and an OverflowException.

Of course, you could insist that I'm wrong, that I haven't reproduced the problem, that the 8 years of .NET programming and 6 or 7 years of Battle.net programming experience I have is irrelevant.  Lemme know.  Oh, and the fact that I wrote MBNCSUtil.  Yeah.
Title: Re: MBNCSUtil.BncsReader problem
Post by: DarkDarkDark on February 28, 2010, 03:41 PM
okay let me check, you don't have to be a ****in dick about it and get all cocky.
Title: Re: MBNCSUtil.BncsReader problem
Post by: DarkDarkDark on February 28, 2010, 03:46 PM
That seemed to be the problem thanks for your help.
Title: Re: MBNCSUtil.BncsReader problem
Post by: rabbit on February 28, 2010, 08:30 PM
Screen shotted for proof.