witam, mam dwa programy : klient i serwer, są one przeznaczone do działania na linuxie, i
najpierw uruchamiam serwer
./serwer1
a następnie klient z parametrami:
./klient1 127.0.0.1 5555
i teraz jest to serwer współbieżny, czyli może obsługiwać kilku klientów jednocześnie, i jest taki problem z serwerem
klient normalnie się uruchamia i wykonuje co ma wykonać i normalnie się kończy, także proces potomny serwera uruchomiony dla tego klienta także się kończy poprawnie (chyba, nie ma go na liście procesów), ale proces macierzysty serwera muszę kończyć killem, bo nie wiem jak go zakończyć ręcznie,
jak zrobić w serwerze kończenie programu głównego po naciśnięciu np. esc??
jak zakończę program serwera killem to ponowne uruchomienie go nie jest możliwe (czasem się udaje) i wyświetla mi zdefiniowany błąd związany z funkcją bind
bardzo proszę o pomoc i wskazówki co mam poprawić bo już nie mam do tego siły.
// Oczekiwanie na żądanie klienta
int koniec = 0;
while(!koniec){
I na przykład jeśli serwer otrzyma słowo ‘exit’ od klienta to ustawisz sobie koniec=1 i wyjdziesz z pętli. Pozostałe opcje to np. obsługa wciśnięcia ctrl+c lub oczekiwanie za pomocą funkcji pool/select na jakieś wydarzenie ( zarówno sockety jak i stdin).
Po nieprawidłowym zamknięciu programu (bez użycia close na sockecie) port jest jeszcze zajęty przez jakiś czas i żadne inny program nie może zrobić bind do tego samego numeru.
właśnie tak myślałem, że właśnie nieprawidłowe zamknięcie programu blokuje gniazdo, ale to już rozwiązałem poprzez funkcję setsockopt() zaczerpniętą z tej strony
to działa dobrze, jeśli nie podam wszystkich parametrów lub podam np. zamiast parametrów np.
./klient1 cos cos to mi ładnie zwraca błąd i wychodzi ale jak uruchomię go z adresem innym niż 127.0.0.1 np: 85.254.598.0 (całkowicie losowy) to jak zrobić aby np. po 10 sekundach zwracał błąd, że nie może się połączyć
bo na razie jak go tak uruchomię to klient się zawiesza i nie może ani się połączyć ani zakończyć.