C # Socket BeginReceive / EndReceive capture multiple messages

Problem:

When I do something like this:

for (int i = 0; i < 100; i++)
{
    SendMessage( sometSocket, i.ToString());
    Thread.Sleep(250); // works with this, doesn't work without
}

With or without sleep, the server records the sending of individual messages. However, without sleep, the client finishes receiving multiple messages in one OnDataReceived, so the client will receive messages such as:

0, 1, 2, 34, 5, 678, 9 ....

Server Submission Code:

private void SendMessage(Socket socket, string message)
{
    logger.Info("SendMessage: Preparing to send message:" + message);            

    byte[] byteData = Encoding.ASCII.GetBytes(message);

    if (socket == null) return;
    if (!socket.Connected) return;

    logger.Info("SendMessage: Sending message to non " +
                "null and connected socket with ip:" + socket.RemoteEndPoint);

    // Record this message so unit testing can very this works.

    socket.Send(byteData);
}

Client Acceptance Code:

private void OnDataReceived(IAsyncResult asyn)
{
    logger.Info("OnDataReceived: Data received.");

    try
    {
        SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
        int iRx = theSockId.Socket.EndReceive(asyn);
        char[] chars = new char[iRx + 1];
        System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
        int charLen = d.GetChars(theSockId.DataBuffer, 0, iRx, chars, 0);
        System.String szData = new System.String(chars);

        logger.Info("OnDataReceived: Received message:" + szData);

        InvokeMessageReceived(new SocketMessageEventArgs(szData));

        WaitForData();  // .....  

Socket Package:

public class SocketPacket
{
    private Socket _socket;
    private readonly int _clientNumber;
    private byte[] _dataBuffer = new byte[1024]; ....

My guess is to do something with the size of the buffer or just between OnDataReceived and EndReceive we get a few messages.

Update: It turns out that when I put Thread.Sleep at the beginning of OnDataReceived, it receives every message. The only solution for this is to wrap my message in a prefix of length and string to indicate the end?

+3
3

.. TCP , "". , , , , .

, :

  • . ( .)
  • ( ) .

, .

+10

TCP - , TCP/IP , ( ).

, , socket.NoDelay = true ( , ), (, , , CR/LF ) , SCTP ( ) UDP ( ).

-2

Source: https://habr.com/ru/post/1760134/


All Articles