Z testów które przeprowadziłem na programach wynikało (...) programy wogóle się ze sobą nie komunikowały.
Podejrzewam, że to kwestia poprawnego wykorzystania VCL-owych socketów, które domyślnie działają w trybie nieblokującym, czyli wywołanie
ReceiveBuf lub
SendBuf może nic nie odebrać/wysłać, co się nie zdarza w przypadku socketów blokujących (w każdym razie w winsock'ach). Następna rzecz to to, że samo przełączenie trybu nie wystarcza. Według dokumentacji zamiast wymienionych metod trzeba użyć specjalnego strumienia.
Z tego co piszesz, czyli, że nadawca będzie czekał, wynika, iż serwer jednak komunikuje się z klientem (...)
Tak. Po każdym odebranym pakiecie odbiorca wysyła nadawcy komunikat
ACK, który potwierdza odebranie pakietu. Czyli nie ma mowy o gubieniu czegokolwiek.
Zastanawia mnie kwestia bufora. Czy przechowuje ona pakiety wysłane przez klienta, czy tylko informacje, że jakieś pakiety są wysyłane?
Przechowuje pakiety odebrane.
Zrezygnowałbym z niego, gdyż sztucznie wydłuża czas oczekiwania z wysłaniem kolejnego pakietu.
No nie sztucznie, bo po co mam wciskać pakiet, jeśli przed ułamkiem sekundy nie było na niego miejsca? Sensowniej jest odczekać chwilę i znowu spróbować (to opóźnienie ma tylko miejsce w przypadku przepełnionego bufora). Zważ jeszcze to, że jeśli bufor socketa nie będzie na bieżąco opróżniany, bo np. coś z siecią będzie nie tak, pętla będzie ryła do wystąpienia timeoutu, zarzynając CPU (tu pewności nie mam).
Zapomniałeś też o rzutowaniu na void.
Heh, nie tyle ja zapomniałem o rzutowaniu, co panowie od VCL-a zapomnieli dodać
const przy wskaźniku w
SendBuf. Problemem nie jest rzutowanie
char* na
void*, bo to jest w pełni legalne i nie wymaga jawnego rzutowania, tylko przypisanie wskaźnika
const na wskaźnik
non-
const. Wszystkie wskaźniki i referencje w parametrach funkcji, które wskazują na obiekty niepodlegające zmianie, powinny być stałe. Takie są zasady dobrego stylu w C++. Panowie nie pierwszy raz dali ciała...
