Gniazdo buforuje otrzymywane dane

Mam aplikację kliencką .NET i aplikację serwerową .NET połączoną za pomocą gniazd.

Klient wysyła ciąg znaków składający się z 20 znaków co 500 milisekund.

Na moim lokalnym komputerze programistycznym działa to doskonale, ale gdy klient i serwer znajdują się na dwóch różnych serwerach, serwer nie otrzymuje łańcucha natychmiast po wysłaniu. Klient nadal wysyła doskonale, potwierdziłem to za pomocą Wireshark. Potwierdziłem również, że serwerrobi odbierać ciągi co 500 milisekund.

Problem polega na tym, że mój serwerpodanie który oczekuje na wiadomość, faktycznie otrzymuje wiadomość co około 20 sekund - a następnie otrzymuje całą zawartość z tych 20 sekund.

Używam asynchronicznych gniazd iz jakiegoś powodu wywołanie zwrotne nie jest wywoływane więcej niż raz na 20 sekund.

WAcceptCallback nawiązuje połączenie i dzwoniBeginReceive

handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);

Działa to na mojej lokalnej maszynie, ale na moim serwerze produkcyjnym ReadCallback nie dzieje się natychmiast.

Rozmiar bufora jest ustawiony na 1024. Próbowałem też ustawić go na 10. Różni się tym, ile danych będzie czytać z gniazda jednocześnie po wywołaniu ReadCallback, ale tak naprawdę nie jest to problemem. Po wywołaniu ReadCallback reszta działa dobrze.

Używam MicrosoftówPrzykład gniazda serwera asynchronicznego więc możesz zobaczyć, jak wygląda moja metoda ReadCallback.

Jak mogę uzyskać wywołanie zwrotne BeginReceive natychmiast, gdy dane dotrą na serwer?

-

AKTUALIZACJA

To zostało rozwiązane. Było tak, ponieważ serwer miał pojedynczy procesor i pojedynczy rdzeń. Po dodaniu kolejnego rdzenia problem został natychmiast rozwiązany. ReadCallback jest teraz wywoływany natychmiast, gdy połączenie przechodzi na serwer.

Dziękuję wszystkim za sugestie !!

questionAnswers(3)

yourAnswerToTheQuestion