Буфер SocketAsyncEventArgs заполнен нулями

Я пишу слой сообщений для моей распределенной системы. Я использую IOCP, то есть методы Socket.XXXAsync.

Вот что-то довольно близкое к тому, что я делаю (на самом деле моя функция получения основана на его): http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html

Теперь я обнаружил, что в начале программы (два тестовых сервера общаются друг с другом) я каждый раз получаю несколько объектов SAEA, в которых.Buffer полностью заполнен нулями, а.BytesTransferred - это размер буфер (1024 в моем случае).

Что это значит? Есть ли особые условия, которые мне нужно проверить? Моя система интерпретирует это как неполное сообщение и движется дальше, но мне интересно, действительно ли я пропускаю некоторые данные. У меня сложилось впечатление, что если ничего не будет получено, вы не получите обратный вызов. В любом случае, я вижу в WireShark, что нет никаких пакетов нулевой длины.

Я нашел следующее, когда гуглил его, но я не уверен, что моя проблема та же: http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e-a355-ee5a6b0b4d2c

http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx

1 ответ

Я не уверен, что происходит в связанном примере. Кажется, что он использует асинхронные сокеты синхронно. Я не вижу никаких обратных вызовов или подобных в коде. Возможно, вам придется переосмыслить, нужны ли вам синхронные или асинхронные сокеты:).

Эта проблема связана с возможностью того, что ваши функции пытаются выполнить чтение / запись в буфер до завершения передачи / приема по сети. Попробуйте использовать функцию обратного вызова, включенную в асинхронный сокет. Например

// This goes into your accept function, to begin receiving the data
    socketName.BeginReceive(yourbuffer, 0, yourbuffer.Length,
        SocketFlags.None, new AsyncCallback(OnRecieveData), socketName);

// In your callback function you know that the socket has finished receiving data
// This callback will fire when the receive is complete.
private void OnRecieveData(IAsyncResult input) {
    Socket inSocket = (Socket)input.AsyncState; // This is just a typecast
    inSocket.EndReceive(input);

    // Pull the data out of the socket as you already have before.
    // state.Data.Write ......
}
Другие вопросы по тегам