Я кодировал слушатель на основе ac # для извлечения данных с сервера фондового рынка.Проблема заключается в том, что после мониторинга через WireShark окно TCP заполняется, что означает, что принимающему хосту (мне) не удается обработать входящие данные достаточно быстро.
Я знаю, что мой провайдер данных отключил подтверждение TCP со своей стороны, поэтому он просто отправляет пакеты TCP и проверяет, все ли они еще там: если он обнаруживает, что они не были обработаны через определенное время, соединение просто отключено.
Я действительно не знаю, что делать, я отключил автоматическую настройку масштаба Windows 7, а также эвристику, но это не имело никакого эффекта.Я также заметил, что нет способа установить размер Windows TPC (RWIN) в Windows 7.
Я знаю, что это не вопрос, связанный с программированием per se , но так или иначе, потому что этокритично с точки зрения кода.
РЕДАКТИРОВАТЬ
Ответчик заявил: «Ваше приложение недостаточно быстро извлекает данные из него». Это довольно интересно, но у меня естьнет реальной идеи о том, как оптимизировать это:
private class IoContext
{
// The socket used for the operation:
public Socket _ipcSocket;
// The buffer used for the operation:
public VfxMsgBlock _ipcBuffer;
public IoContext(Socket socket, VfxMsgBlock buffer)
{
_ipcSocket = socket;
_ipcBuffer = buffer;
}
}
private void InitiateRecv(IoContext rxContext)
{
rxContext._ipcSocket.BeginReceive(rxContext._ipcBuffer.Buffer, rxContext._ipcBuffer.WrIndex,
rxContext._ipcBuffer.Remaining(), 0, CompleteRecv, rxContext);
}
private void CompleteRecv(IAsyncResult ar)
{
IoContext rxContext = ar.AsyncState as IoContext;
if (rxContext != null)
{
int rxBytes = rxContext._ipcSocket.EndReceive(ar);
if (rxBytes > 0)
{
//Adjust the write index in the message block:
rxContext._ipcBuffer.WrIndex = rxContext._ipcBuffer.WrIndex + rxBytes;
//(...) Do Stuf here with data
rxContext._ipcBuffer.Crunch();
//Initiate another asynchronous read:
InitiateRecv(rxContext);
}
}
}
РЕДАКТИРОВАТЬ 2
В ответ на Лена Холгейта:
Я изменил / проверил размер буфера Recv напрямуючерез свойство c # (возникли некоторые проблемы при использовании GetSocketOption / SetSocketOption)
Я могу заметить небольшое изменение производительности, когда я изменяю размер Socket Buffer, т. е. соединение падает после 10 мин с большим буфером (1000000), а не 3 мин (используя10240 или меньше (даже 0, я не знаю, почему ... странно))
Вот первый журнал WireShark, который я получаю:
[SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1380 SACK_PERM=1 WS=128
Это ничего не меняетРазмер принимающего буфера сокета
Что касается Windows 7 и TCP Размер Windows, я имел в виду, что перезапись TCP Management в Windows привела к тому, что он масштабировался автоматически, и нет параметра реестра, который можно было бы установить «вручную».
Однако вы правы: для каждого сокета это настраивается с использованием размера буфера приема.
Источник здесь среди прочих