several napisał(a)
Wiem że TCP dba o poprawność transmisji, ale informacja nie dochodziła mi w całości i to jest fakt. Obsługując FTP nie udało mi się na raz wysłać pliku większego niż 7.5kB. "Na raz" czyli zapakować do send() bufor o takim rozmiarze.
TCP jest protokołem strumieniowym. Tam nie przesyła się danych "na raz". Nie ma gwarancji, że pojedyncze wywołanie send() spowoduje wysłanie wszystkich danych z przekazywanego mu bufora (to samo jest "w drugą stronę" z recv()). Dlatego powinieneś po każdym wywołaniu send() sprawdzać wartość zwracaną i w razie potrzeby (jeśli nie poleciało wszystko) powtórzyć wywołanie z danymi, które zostały. W niektórych bibliotekach są funkcje sendall() i recvall(), które robią tę pętelkę.
Jeśli chcesz mieć "jeden send() - jedno recv()", to powinieneś użyć protokołu datagramowego (UDP). Jeśli musisz użyć TCP, musisz poprawnie obsługiwać transmisję.
several napisał(a)
To nie jest tak że chciałem ładować pliki do pamięci, wiadomo że trzeba je pociąć żeby ramu nie zawalić, po prostu robiłem testy. Testy przeprowadzałem na plikach graficznych, wrzuciłem na przypał wszystkie bajty do tablicy i patrzyłem jak sobie z takim czymś send() i recv() poradzi, i rezultaty były jak napisałem wyżej. Tym nie mniej, te bajty które doszły były poprawne, włączając podgląd takiego pliku widać było obciętą grafikę. I stąd mój wniosek by nie traktować send() i recv() buforami większymi niż 1K.
To założenie jest dość niebezpieczne. Może się zdarzyć tak, że jedno wywołanie send() wyśle np. tylko 512B. Wtedy będziesz miał "dziurę" w danych.
several napisał(a)
Być może to było jakieś moje niedopatrzenie, jeżeli ta sytuacja Cię interesuje pokażę Ci kod mojego ftpa i wtedy będziesz mógł potwierdzić lub wykluczyć mój błąd. Kod wymaga refaktoryzacji bo pisałem go daaawno i zostało tam jeszcze kilka komentów które zdążyłem sobie wyjaśnić ale kilka razy wysyłałem i odbierałem za jego pomocą pliki o rozmiarze ~700MB więc działa poprawnie.
Nie ma takiej potrzeby :)
Polecam natomiast przeczytanie książki (np. "Programowanie Zastosowań Sieciowych w Systemie UNIX") żeby zobaczyć co i jak. Reguła braku gwarancji wysłania/odebrania danych jednym wywołaniem nie jest taka oczywista i wiele osób się na to nacina.