Буфер 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 ......
}