Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Скорость приема данных по TCP


Автор: Sality123 31.8.2012, 20:26
Всем привет, у меня есть два обычных подключения TcpClient() 
Код

sokSend = ConnectServer();
sokListen = ConnectServer();


в один я пишу
Код

NetworkStream stream = sokSend.GetStream();
if(stream.CanWrite)
{
    stream.Write(btSend,0,btSend.Length);
}


из другого читаю
Код

if(stream.DataAvailable)
{                
        Array.Clear(btReadBuffer,0,btReadBuffer.Length);
        int countStream = stream.Read(btReadBuffer, 0, btReadBuffer.Length);


сервер мне отправляет 30 раз в секунду пакеты по 50 байт. пакеты пронумерованы.
функцию чтения я вызываю гдето 50 раз в секунду, но так как стоит проверка stream.DataAvailable с сокета я читаю только когда мне открывается эта функция (хочу заметить не тогда када есть данные уже в сокете, так как первый прием пакета получается с куском следующего)

Все бы прекрасно, но полученные пакеты где то на 6-10 пакетов отстают от отправляемых сервером. уменьшая частоту отправки пакетов до 20 картина в разрыве отставания не изменилась, я сделал вывод, что при получении первого пакета сокет мне его не отдает, а ждет еще. Из за этого и получается сдвиг в полученых пакетах

Вопрос, есть ли возможность уменьшить читающий буфер, чтоб команда  stream.DataAvailable открывалась чаще, и я мог получить данные именно по приходу первого пакета, а не када накопится 5 и более штук

Автор: Sality123 31.8.2012, 21:48
Для теста замерял длину каждого пакета который я принимаю, и несмотря на то что сервер пакеты отправляет по 50 байт, мне приходят пакеты по 800 байт, тоесть сокет нагло накапливает данные перед отдачей. Есть ли способ нагло выдирать из потока данные у него?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)