Send larger messages than 126 bytes in C #

Now I am working on Websockets, I am new to this, I can finally send a message of 126 bytes, but I need to send longer messages, but when I try to close the connection, my code is:

public void sendMessage(Stream stream, string message) { try { List<byte> lb = new List<byte>(); string aux = message; bool flagStart = false; int size; while (message.Length > _maxLengthMessage) { lb = new List<byte>(); // I cut the mesasge in smaller pieces to send message = aux.Substring(0, _maxLengthMessage); aux = aux.Substring(_maxLengthMessage); if (!flagStart) { // In doc of Websockets i sign this piece: not the end, text lb.Add(0x01); flagStart = !flagStart; } else { // In doc of Websockets i sign this piece: not the end, continuation lb.Add(0x00); } size = message.Length; lb.Add((byte)size); lb.AddRange(Encoding.UTF8.GetBytes(message)); stream.Write(lb.ToArray(), 0, size + 2); } lb = new List<byte>(); if (!flagStart) { // If is this the only message we mark with: end of message, text lb.Add(0x81); flagStart = !flagStart; } else { //else Is the end of the message but is the continuation frame lb.Add(0x80); } size = aux.Length; lb.Add((byte)size); lb.AddRange(Encoding.UTF8.GetBytes(aux)); //lb.AddRange(Encoding.UTF8.GetBytes(i.ToString())); stream.Write(lb.ToArray(), 0, size+2); } catch (Exception ex) { throw ex; } } 

I don’t know if I work very well, but I need help, it is urgent, and I don’t know what to do, I search on the Internet, but I always find the same answer. "Go to The WebSocket Protocol" I did this and nothing, maybe I do not understand very well, so I need your help.

Thanks.

0
source share
2 answers

Your code for recording the length of the message should be extended. The extended payload in the data generation diagram of the protocol specification indicates that it is missing.

For messages up to 125 bytes in length, your code is correct.
For messages> 125, but <= 65536 bytes, you need to write 3 bytes - the first byte is 126; the next 2 bytes give the length of the message.
For messages> 65536 bytes you need to write 9 bytes - the first byte is 127; the next 8 bytes give the length of the message.

+2
source

You have to create the correct frame, here is the way:

 static private byte[] CreateFrame(string message, MessageType messageType = MessageType.Text, bool messageContinues = false) { byte b1 = 0; byte b2 = 0; switch (messageType) { case MessageType.Continuos: b1 = 0; break; case MessageType.Text: b1 = 1; break; case MessageType.Binary: b1 = 2; break; case MessageType.Close: b1 = 8; break; case MessageType.Ping: b1 = 9; break; case MessageType.Pong: b1 = 10; break; } b1 = (byte)(b1 + 128); // set FIN bit to 1 byte[] messageBytes = Encoding.UTF8.GetBytes(message); if (messageBytes.Length < 126) { b2 = (byte)messageBytes.Length; } else { if (messageBytes.Length < Math.Pow(2,16)-1) { b2 = 126; } else { b2 = 127; } } byte[] frame = null; if(b2 < 126) { frame = new byte[messageBytes.Length + 2]; frame[0] = b1; frame[1] = b2; Array.Copy(messageBytes, 0, frame, 2, messageBytes.Length); } if(b2 == 126) { frame = new byte[messageBytes.Length + 4]; frame[0] = b1; frame[1] = b2; byte[] lenght = BitConverter.GetBytes(messageBytes.Length); frame[2] = lenght[1]; frame[3] = lenght[0]; Array.Copy(messageBytes, 0, frame, 4, messageBytes.Length); } if(b2 == 127) { frame = new byte[messageBytes.Length + 10]; frame[0] = b1; frame[1] = b2; byte[] lenght = BitConverter.GetBytes((long)messageBytes.Length); for(int i = 7, j = 2; i >= 0; i--, j++) { frame[j] = lenght[i]; } } return frame; } 
+1
source