Tcp network stream problem

sgt_pinky

Regular
Joined
Jan 5, 2005
Messages
80
Location
Melbourne, Australia
I have this problem when I am writing and reading network streams. If I send another packet, then it will also send the last packet again, so I end up sending more and more information. Somehow I mustn't be flushing the buffer out correctly or something. This is my output if I click a button 3 times - you can see by the third time it has sent the packet 3 times, and hence the server replies 3 times.

Recieved packet: hs#USHOEOZSSUNW
Connection verified.
Recieved packet: hs#YTZJCYVGGWRX
Recieved packet: hs#YTZJCYVGGWRX
Connection verified.
Connection verified.
Recieved packet: hs#THPQVRMIHKML
Recieved packet: hs#THPQVRMIHKML
Recieved packet: hs#THPQVRMIHKML
Connection verified.
Connection verified.
Connection verified.

To send a packet I am using:

Visual Basic:
        Dim ns As NetworkStream = Client.GetStream
        If ns.CanWrite Then
            Dim bytes() As Byte = Nothing
            bytes = System.Text.Encoding.UTF8.GetBytes(Msg)
            ns.Write(bytes, 0, bytes.Length)
        End If

To receive a packet I am using:

Visual Basic:
                    Dim ns As NetworkStream = cli.GetStream
                    If ns.CanRead And ns.DataAvailable Then
                        Dim bytes(cli.ReceiveBufferSize) As Byte
                        ns.Read(bytes, 0, cli.ReceiveBufferSize)
                        RaiseEvent NewPacket(cli, System.Text.Encoding.UTF8.GetString(bytes))
                    Else
                        cli.Close()
                        Connections.Remove(cli)
                        RaiseEvent ClientMessage("Client connected from " & cli.Client.RemoteEndPoint.ToString.Split(":")(0) & " has disconnected.")
                    End If

I have tried closing the stream after I have finished writing, but that seems to destroy the socket. I have tried Flush() too, but not too sure how to use that one.

Cheerio,

Pinky
 
Assuming you're using tcp......

1) Try disabling the nagle algorithm using setsocketoptions method. THe nagle
algorithm basically prevents data from being sent immediately (think chatty clients).

2) When you finished writing your custom packet, flush the data by calling the Flush method.

3) Closing a socket will drop the connection. I believe with networkstreams though, there's a boolean indicating if it owns the underlying socket or not. If it doesn't, it won't close the underlying socket.
 
Firstly, thanks for your quick replies HJB417.

Yep, I'm using TCP. I did a bit more research on the 'Flush()' method, and I found that it is 'Reserved for later use.'

I actually fixed my problem though. I was brute force testing a multiple connection server with a little app I made to generate lots of clients. Each time I clicked the button it generated a client, AND added a handler for each client! So when I had added 3 clients, I was getting 3 lots of messages ;-)

Oh well, the best problems are the ones with the simplest solutions I guess.

Thanks again,

Pinky
 
Back
Top