WinSock - Send, łączy pakiety - jak tego uniknąć?

WinSock - Send, łączy pakiety - jak tego uniknąć?
Software
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 175
0

Witam, chce wysyłać duże ilości pakietów o sporym rozmiarze każdy przy pomocy WinSock, niestety okazało się, że przy częstym używaniu Send(), Winsock ładuje dane do jednego bufora i wysyła razem, a ja bym chciał uniknąć tego zjawiska, np chce wysłać 1000 pakietów po 1000 B każdy, każdy pakiet na swoim początku ma specyficzny nagłówek który jest sprawdzany przy odbiorze, i np Winsock pakuje mi 2 pakiety po 1000 B i jeszcze nieduży kawałek na końcu np 48 B trzeciego pakietu, przez co przy odbiorze danych poleceniem Recv() mam pakiet o rozmiarze 2048, nie było by to takie bardzo złe, gdyby nie to że w kolejnym pakiecie mam przesunięcie o te 48B i brak nagłówka na początku w kolejnym pakiecie, ;/ Ktoś ma jakieś pomysły?

Jestem wdzięczny za pomoc.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

Możesz użyć setsockopt z TCP_NODELAY, aby wyłączyć algorytm Nagle'a, ale wiedz, że coś w środku komunikacji między serwerem i klientem może znów połączyć lub zmienić długości pakietów.

Zamiast udawać, że TCP nie jest protokołem strumieniowym, obsłuż go jak strumień. Czyli czytaj tyle bajtów ile potrzebujesz, a na resztę albo czekaj, albo samodzielnie buforuj.

Software
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 175
0

Witam, Dziękuję za szybką odpowiedź, no trochę z tym skopałem sprawę, bo faktycznie dużo lepiej bym zrobił, robiąc to na zasadzie ile danych przeczyta tyle weź i przetwórz, A miałbym jeszcze takie pytanie, protokół UDP nie robi takiego podziału/ łączenia buforów? tylko wysyła datagram tak jak go się nadało?

NeuroXiq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Racibórz
  • Postów: 101
1

To też zależy jak długi chcesz wysłać datagram. Ale w twoim przypadku wysyłać będzie tak jak piszesz. Poza tym na niekorzyść UDP przemawia fakt, że nie gwarantuje on dostarczenia pakietu. Jak będziesz korzystał z TCP to po utraceniu połączenia coś się po prostu wywali - będzie można wiedzieć co i gdzie poszło nie tak - w przeciwieństwie do UDP. Jeżeli są 'delikatne' dane to proponowałbym pozostać przy TCP. Proszę też na to zwrócić uwagę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.