WSARecv/WSASend

0

mam program ktory kozysta z pakietow message oriented.
do tej pory uzywalem recv/send i odbieralem dane po 2 razy - pierwszy dopuki nie odbiore 4 bajtow naglowka, drugi raz dopoku nie odbiore ilosci dnaych zawartych w tych 4 bajtach.
po odebraniu drugiej porcji danych rozbijam to na naglowki i przetwarzam.

Przegladalem sobie msdn zeby sie doksztalcic z winsock2 i znalazlem ciekawa informacje - WSASend/Recv supportuja wlasnie to. Przekazuje im WSABUF i w nim ustalam kolejne naglowki, jest to wygodne.

Ale jak rozwiazac problem kiedy wywolanie WSARecv nie odbierze tylu danych ile bym chcial?
Jak po raz kolejny bede chcial skozystac z tej funkcji bede musial odpowiednio usunac WSABUFy i zmienic pointer z tego co sie nie wyslal/odebral do konca. Wydaje mi sie ze winsock2 jakos rozwiazuje ten problem.

Chcialbym zeby moj event/port/iocompletion zostal powiadomiony dopiero jak przesle tyle bajtow ile podam w strukturach WSABUF, albo jak polaczenie zostanie zamkniete.

Czy moze jednak lepiej manualnie odejmowac lpNumberOfBytesSent odilosci danych jakie chce przeslac, i manualnie updatowac WSABUFy?

0

Przelecialem dla pewnosci po:
http://msdn.microsoft.com/en-us/library/ms741688(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms742203(VS.85).aspx
"There is no guarantee that more than a single byte will be returned. For protocols acting as message-oriented, a full message is required to unblock the caller." Wiec, zaleznie od Twojego proto, WSA bedzie sie zachowywac tak albo siak. Acz IMHO, mowa tutaj jest o wiadomosci sieciowej, czyli pakiecie tcp/udp/..

WSABUF jednak jak dla mnie jest tylko idioten-struktura ktora ma trzymac buforchar* oraz jego dostepna pojemnosc. Nie widze nigdzie zadnego zapisu jakoby WSA mialo wysylac automatycznie tęże dlugość. Jesli widzisz gdzies taka informacje, wskaż ją prosze. Obecnie jestem w 100% pewien, ze WSASend/Recv zachowuje sie dokladnie tak jak send/recv -- czyli zadane bufory wysyla/odbiera w dowolnych kawalkach i samemu trzeba sobie pilnowac swoich wiadomosci

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