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

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.

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.

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?

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ę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1