Ron Gross
Ron Gross

Reputation: 1624

Socket stops receiving after X messages

I have a .NET Socket that listens to all TCP requests on the computer, and aggregates them into HTTP requests (where possible).

I have the following problem - When I access a site (for example - stackoverflow.com) I see in WireShark that there are X (lets say - 12) TCP packets received from the site's host. But in my code the Socket just stops receiving the messages before the end (after 10 messages)

I have no idea how to fix this, I hope it's something that is limiting the socket in his definition

Here is my code:

public void StartCapturing()
    {
        try
        {
            _chosenOutgoingAddress = UserChoosesIpCtrl();

            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw,
                                 ProtocolType.IP);
            _socket.Bind(new IPEndPoint(_chosenOutgoingAddress, 0));
            _socket.SetSocketOption(SocketOptionLevel.IP, 
                                    SocketOptionName.HeaderIncluded, true);
            _socket.IOControl(IOControlCode.ReceiveAll, _bIn, _bOut);

            thrStartCapturing = new Thread(StartReceiving);
            thrStartCapturing.Name = "Capture Thread";
            thrStartCapturing.Start();
        }
        catch (Exception ex)
        {
            //TODO: general exception handler
            throw ex;
        }
    }

The StartCapturing method will initiate the Socket and start the receiving thread with the StartReceiving method (as below0

private void StartReceiving()
    {
        while (!_stopCapturing)
        {
            int size = _socket.ReceiveBufferSize;
            int bytesReceived = _socket.Receive(_bBuffer,
                                                0, 
                                                _bBuffer.Length, 
                                                SocketFlags.None);

            if (bytesReceived > 0)
            {
                _decPackagesReceived++;
                ConvertReceivedData(_bBuffer, bytesReceived);
            }
            Array.Clear(_bBuffer, 0, _bBuffer.Length);
        }
    }

What am I doing wrong?

Upvotes: 1

Views: 139

Answers (1)

Ron Gross
Ron Gross

Reputation: 1624

Ok, I figured it out, so I'm posting here for anyone else who might need it in the future

The .NET Socket class has a property ReceiveBufferSize which determines what is the buffer that the Socket will allow.

My problem was that my code wasn't ASync, or fast enough to clean this buffer, so that the last TCP packets had no more buffer and were ignored.

Increasing the ReceiveBufferSize or make my code ASync (probably better :-)) will fix this.

Upvotes: 1

Related Questions