2012-05-23 19 views
5

Muszę zaakceptować wiele połączeń do tego samego portu. Używam gniazda w C++, chcę zrobić coś jak SSH zrobić. Mogę wykonać użytkownika ssh @ maszyna "ls -lathrR /" i uruchomić inne polecenie na tym samym komputerze, nawet jeśli pierwszy nadal działa.Wiele połączeń w tym samym gnieździe portu C++

Jak mogę to zrobić?

Dzięki.

+0

Jeśli nie rozumiem programowania gniazd, sugeruję, aby nie używać zwykłych gniazd. Zamiast tego użyj struktury sieciowej. [ACE] (http://www.cs.wustl.edu/~schmidt/ACE-overview.html) lub [ZeroMQ] (http://www.zeromq.org/). Początkowo wygląda to na dobry pomysł, aby zrobić gniazda wanilii, ale z czasem robi się bałagan. – Vikas

+0

Próbowałem odsłuchać port ponownie w innym wątku, ale nie zadziałało, mówi, że port jest w użyciu, więc zapytałem;) – Lefsler

+0

Nie ma nic szczególnego, co musisz zrobić. Nadal słuchasz, więc nie próbuj ponownie słuchać. –

Odpowiedz

10

Potrzebny jest wielowątkowy serwer gniazd.

Do tego potrzebny jest główny wątek, który otwiera gniazdo do nasłuchiwania (i czeka na przychodzące połączenia klienta). To musi przejść do jakiejś pętli.

Następnie, gdy klient się z nim łączy, funkcja accept() odblokuje się i w tym momencie należy obsłużyć żądanie klienta, przekazując żądanie do wątku, który się nim zajmie.

Po stronie serwera nastąpi powrót do pętli i oczekiwanie na inne połączenie, podczas gdy poprzedni wątek wykonuje swoje zadanie.

Możesz utworzyć wątki według potrzeb lub użyć puli wątków, która może być bardziej wydajna (oszczędność na czas inicjowania nowych wątków).

Poszukaj więcej informacji pod numerem here. Wyszukaj gniazdo serwera wielowątkowego w Internecie, w szczególności bind(), listen() i accept() od strony serwera.

+0

Spróbuję, bo jeśli chcę się połączyć, to znaczy, że adres jest już w użyciu. – Lefsler

+0

może się tak zdarzyć, jeśli próbujesz powiązać port już używany przez inną aplikację. jakiego portu próbujesz słuchać? – fduff

+0

Potrzebuję 2 aplikacji do wysyłania danych do tego samego portu, tak jak ssh, gdy wysyłasz więcej niż jedno polecenie w tym samym czasie. – Lefsler

1

Musisz przeczytać na ::listen() i ::accept().

Ten pierwszy skonfiguruje gniazdo do słuchania. Następnie potrzebujesz pętli (prawdopodobnie w jej własnym wątku), która używa ::accept(), która będzie zwracana za każdym razem, gdy pojawi się nowe połączenie.

Pętla ta powinna następnie utworzyć nowy wątek, do którego należy przekazać deskryptor pliku otrzymany od ::accept(), a następnie obsłużyć wszystkie operacje wejścia/wyjścia na tym gnieździe.

0

Stare pytanie jest stare, ale uważam, że nikt, kto odpowiedział, nie zrozumiał pytania OP.

Nie rozumiesz, jak działa szaman. Kiedy wysyłasz wiele komend/wiele połączeń do serwera przez ssh, na serwerze, z którym się łączysz, jest tylko JEDEN program, który odbiera wszystkie te komendy.

Sshd (demon ssh) działa na serwerze i jest wielowątkowym serwerem gniazd (patrz odpowiedź fduffa). Jest to jedyny program, który nasłuchuje na porcie 22 i samodzielnie obsługuje wszystkie przychodzące połączenia SSH.

+0

Dzięki Conslo, ale już rozwiązałem problem miesiące temu. – Lefsler

Powiązane problemy