Hi Károly,

If I do not do the "While Not llogReadEverything" loop, it reads the data.
Do not understand the reason why. :)

The problem is this line:

lintSize += tobjNetStream.Read(tbytBuffer, 0, tintFullSize)

As you are using the same buffer to read data you should increase the offset
everytime you read data.

The stream is sequential so the data you already have read is dropped by the
stream. (It it is buffered position is incremented and you have to seek back
if you want to access data you alread read.)

Furthermore you should decrement tintFullSize not to read more than you
want.

And you don't have to check DataAvailable because according to the
documentation it will block until some data is available. This doesn't means
that it will wait for all the data specified in size but it will return at
least one byte unless the connection is closed when it returns zero bytes.

You don't have to use ByRef if you want to access and object or modify an
array. You need it if you want to replace the object or the array with a
different one. I think a static buffer could be more efficient (don't have
to allocate new buffer everytime you call the funtion in the same method as
long as you use the same array) and you could simply use tintFullSize as a
number to be read. If you don't want this change you have to use ByRef as
you did before. And I think it is better to read the number of bytes read
than allways true.

You can ignore the above changes if you want.

I suggest you to use something like this:

Private Function ReadData(ByVal networkStream As NetworkStream, _
ByVal buffer As Byte(), ByVal size As Integer) As Integer
   Dim read As Integer
   Dim offset As Integer = 0

   Do
       read = networkStream.Read(buffer, offset, size)
       offset += read
       size -= read
   Loop Until size <= 0 OrElse read <= 0

   Return offset
End Function

Note that the above function does the same as NetworkStream.Read with the
exception that it will read "size" bytes anyway by waiting for data until
the connection is closed when it may return less bytes as no more is
available and will not arrive after the connection is closed.

Kornél

-----Original Message-----
From: Martin Hinks [mailto:[EMAIL PROTECTED]
Sent: Wednesday, July 20, 2005 10:59 AM
To: Arnhoffer Károly
Cc: mono-devel-list@lists.ximian.com
Subject: Re: [Mono-devel-list] NetworkStream


Hi Arnhoffer,

There are various things to try:

1.) Check that tIntFullSize is not 0 when the .Read line is called.
2.) Try this with a plain networkstream derived from a socket rather than
from a TcpClient
3.) If you are trying to read the entire buffer of length tintFullSize, is
it not possible that the server has not sent all the data when the read is
performed? ie. Just because DataAvailable is true does NOT mean that you may
be able to read ALL the data you are expecting from the stream, it might not
have arrived yet, and as you are expecting to be able to read it all it
might return 0 (I think it should block though, which is why it must work on
.NET)
4.) After some of the diagnoses above, file a bugzilla report.

Martin

On 7/20/05, Arnhoffer Károly <[EMAIL PROTECTED]> wrote:
Hi,

I have a server service created by Visual Studio .Net. It is using
System.Net.Sockets.TcpClient.GetStream to get a stream to communicate
on the network. When I run this service on a Windows machine (MS .NET
framework) everything is fine, but when running on a Linux machine
(SuSE 9.2, Mono 1.1.8 (from RPMs)) the service reads allways zeroes
from the stream.

Example:

        Private Function ReadData(ByRef tobjNetStream As
NetworkStream, ByRef tbytBuffer As Byte(), ByVal tintFullSize As
Integer) As Boolean

                Dim lintSize As Integer = 0
                Dim llogReadEverything As Boolean
                Dim lintCounter As Integer

                ReDim tbytBuffer(tintFullSize - 1)

                While Not llogReadEverything
                        While Not tobjNetStream.DataAvailable
                                Thread.CurrentThread.Sleep(50)
                        End While

                        lintSize += tobjNetStream.Read(tbytBuffer, 0,
tintFullSize)
                        If lintSize >= tintFullSize Then
                                llogReadEverything = True
                        End If
                End While


                Return True
        End Function

A function like this gets zeroes from the stream when nonzero data was
sent.


Thanks!
Arnhoffer Károly _______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list



--
Martin Hinks
http://www.m-s-d.net
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to