Luka Horvat
Luka Horvat

Reputation: 4412

Transmitting strings between a C# client and a Node server

I have a node TCP server working and waiting for data and for every socket I have

socket.on("data", function () {

});

Now, as far as I understand, this will get invoked whenever there's any data received. That means that if I send a large string, it will get segmented into multiple packets and each of those will invoke the event separately. Therefore I could concatenate the data until the "end" event is invoked. According to the Node documentation this happens when the FIN packet is sent.

I have to admit I don't know much about networking but this FIN packet, do I have to send it manually when sending data from my C# app or will thise code

var stream = client.GetStream();
using (var writer = new StreamWriter(stream)) writer.Write(request);

send it automatically when it manages to send the whole request string? Secondly, how does it work from the other end? How do I send a "batch" of data from Node to my C# client so that it knows that the whole "batch" should be considered one thing, despite it being in multiple packets?

Also, is there an equivalent of the "end" even in .NET? Currently, I'm blocking until the stream's DataAvailable is true but that will trigger on the first packet, right? It won't wait for the whole thing.

I'd appreciate if someone could shed some light on this for me.

Upvotes: 0

Views: 559

Answers (1)

loganfsmyth
loganfsmyth

Reputation: 161517

The TCP FIN packet will be sent when you call writer.Close() in C#, which will trigger the end event in Node as you said.

Without seeing how your C# reading code looks I can't give specifics, but C# will not fire an event when Node closes the connection. It will no longer be stream.CanRead, and if you had a current stream.Read call blocking, it will throw an exception.

TCP provides a stream of bytes, and nothing more. If you are planning to send several messages back and forth from Node and C#, it is up to you to send your messages in such a way that they can be separated. For instance, you could prefix each message with the length, so that you read one byte, and then read that many bytes after it for the message. If your messages are always text, you could encode it as JSON and separate messages with newlines.

Upvotes: 1

Related Questions