Вопрос по sockets, c#, .net, asyncsocket, io-completion-ports – Буфер SocketAsyncEventArgs заполнен нулями

6

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

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

What I've found now is that at the start of the program (two test servers talking to each other) I each time get a number of SAEA objects where the .Buffer is entirely filled with zeroes, yet the .BytesTransferred is the size of the buffer (1024 in my case).

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

При поиске в Google я обнаружил следующее, но не уверен, что моя проблема та же: 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

У меня нет ответа для вас, но, возможно, это даст некоторую информацию: некоторое время назад я делал проект в .NET 3.5 для университетского курса с моим другом. Мы столкнулись со странным поведением, когда в одной версии Windows буфер был пуст, а в другом он был заполнен нулями. Версия была WinXP и Win7, но я не помню, какой путь. Paweł Motyl
@Carlos Yes Network Service - это только абстракция к стандартному обмену данными через сокеты, которая расширена до более новых полезных функций Я рекомендую вам создать проект PoC (Proof of Concept) и попробовать его. Это стоит попробовать. Daniel Skowroński
У меня не было ошибок обработки данных из потерянных данных, поэтому я думаю, что ничего не потеряно. Но это все еще оставляет вопрос о том, почему метод будет возвращаться ни с чем, несколько раз. Carlos
Трудно найти решение, которое вам нужно, без вашего краткого описания (с кодом). Однако у меня был опыт работы с Sockets, и я могу рекомендовать использовать более высокую абстракцию - Network Stream. Сетевой поток обладает всеми возможностями асинхронного обратного вызова, которые вы хотите использовать. смотреть наmsdn.microsoft.com/en-us/library/… а такжеmsdn.microsoft.com/en-us/library/… НТН Daniel Skowroński
Это те же основные звонки? Это звучит полезно. Кроме того, код, на который я ссылаюсь, находится в ссылке. Carlos

Ваш Ответ

1   ответ
0

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

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

// 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 ......
}
Обратные вызовы являются обработчиками событий для объектов SAEA. Я действительно запускаю код с некоторыми минимальными грамматическими ошибками. Carlos
Можно ли вставить код получателя в pastebin или аналогичный, я видел только тот пример, на котором вы основываете свой.

Похожие вопросы