Przekaż argumenty do wykonywalnego Uniksa w terminalu Mac

0

Jestem całkiem nowy w kodowaniu Uniksa i chciałbym popracować nad kilkoma prostymi projektami sieciowymi. Znalazłem kilka samouczków, których dokładnie szukam - w szczególności ten: http://www.linuxhowtos.org/C_C++/socket.htm .

Zrozumiałem, jak skompilować pliki serwera i klienta c w pliki wykonywalne i mogę je uruchomić w terminalu w następujący sposób:

open server
open client

ponieważ używam Mac OS X 10.7.5. Mój problem polega na tym, że muszę przekazywać argumenty do tych programów podczas ich inicjowania. Samouczek używa tego kodu:

server 51717
client clientName 51717

ale nie znalazłem sposobu na skopiowanie tego w moim terminalu Mac.

open server --args 51717 //doesn't work

Znalazłem ten post i utworzyłem skrypt jabłkowy z tym kodem

do shell script "open -a /Desktop/server --args 51717"

ale to powoduje wiele błędów. Próbowałem wielu odmian, ale nie udało mi się uruchomić żadnej. Nie mogłem też uruchomić przykładu Chrome z tego postu (nie mam zainstalowanego FF).

Jak przekazać prosty numer portu jako argument do programu, tak jak w samouczku? Czy to łatwiej zrobić na komputerze z systemem Linux? W tej chwili nie mam problemu ze zmianą systemu operacyjnego i byłoby idealnie, gdybym mógł użyć składni „serwer 51717”, której używa samouczek, zamiast tworzyć osobny skrypt uruchamiania dla każdego programu. Szukasz odpowiedzi i porady. Dzięki.

EDYTOWAĆ:

Sprawiłem, że działa poprawnie, ale coś wciąż nie działa poprawnie. Uruchamiam serwer w następujący sposób:

$ ./server 3456

następnie otwórz nowy terminal i uruchom klienta z ograniczonym sukcesem:

$ ./client mClient 3456
ERROR, no such host
$ ./client 127.0.0.1 3456
Please enter the message: //running correctly
//... this also works
$ ./client 127.1 3456
Please enter the message: //running correctly

Mogę uruchomić klienta z pewnymi kombinacjami liczb. Numerów, ale to nie działa dla wszystkich i nie mogę używać żadnych liter. Dlaczego działa tylko jedno z tych rozwiązań?

ROZWIĄZANIE:

$ sudo nano /private/etc/hosts

dodaj 127.0.0.1 mClientna dole, a następnie naciśnij Ctrl ^ o, aby zapisać

Teraz to działa:

$ ./client mClient 3456
Cbas
źródło
Czy musisz używać open? Nie możesz po prostu uruchomić pliku binarnego bezpośrednio np. Cd do katalogu z nim w, a potem ./server 51717?
Dave C
Nie muszę używać otwartego, nie wiedziałem, że mogę bezpośrednio wywołać exe (próbowałem „$ server”, ale to nie działało, więc założyłem, że potrzebuję funkcji uruchamiania). Nadal mam problemy z uruchomieniem klient jednak - nie akceptuje ciągów jako nazw hostów
Cbas
1
Więc mClient to twoja nazwa hosta? Czy przeprowadzasz na nim wyszukiwanie DNS (zakładam, że tak, ponieważ błędem jest brak takiego hosta), w którym to przypadku istnieje i działa dla Twojego klienta? Co się stanie, jeśli wyślesz ping do mClient?
Dave C
to był problem, nie wiedziałem, że muszę zdefiniować alias w hostach przed jego użyciem. Dzięki
Cbas

Odpowiedzi:

1

Skompiluj kod:

$ gcc client.c -o client
$ gcc server.c -o server

Uruchom serwer bez argumentów:

$ ./server
ERROR, no port provided

Uruchom serwer z jednym argumentem:

$ ./server 3456

W innym terminalu:

$ ./client 3456
usage ./client hostname port  

komunikat użytkowania wskazuje, jak uruchomić plik binarny, czyli jakie argumenty podać

$ ./client eee.lan 3456
Please enter the message:

ponieważ serwer nasłuchuje na wszystkich interfejsach, możesz również użyć

$ ./client 127.0.0.1 3456
Please enter the message: Hello World!
I got your message

więc argumenty są łańcuchami po poleceniu. W przykładzie gcc są 3 argumenty:server.c -o server

odpowiednią częścią kodu jest (serwer):

portno = atoi(argv[1]);

argv jest wektorem (tablicą), który przechowuje wszystkie argumenty podane w poleceniu w wierszu polecenia. atoi konwertuje ciąg na liczbę całkowitą.

Ярослав Рахматуллин
źródło
przy użyciu adresu IP, nazwa hosta jest jedyną rzeczą, która wydaje się działać - zobacz moje zmienił na przykład
CBA
Musisz skonfigurować prawdziwy serwer DNS lub aliasy / etc / hosts, aby niestandardowe nazwy działały. Założę się, że używanie localhostbędzie również działać, ponieważ jest ono aliasowane do 127.0.0.1, twój lokalny adres IP również (192.168.0.13 lub inny).
Ярослав Рахматуллин
Och, dzięki teraz to ma sens. Dodałem alias w pliku hosts i uruchomiłem go.
Cbas
1

Po prostu uruchom plik binarny bezpośrednio z konsoli - używając open na moim MacBooku (10.8.4) „arbitralnych” plików binarnych nie można otworzyć z open (open ma na celu użycie deskryptora pliku do otwarcia pliku w odpowiedniej aplikacji).

Na przykład, jeśli pliki binarne serwera i klienta znajdują się na pulpicie (~ / Desktop), można je uruchomić z konsoli za pomocą:

~/Desktop/server 51717
~/Desktop/client clientName 51717

Lub lokalnie w katalogu Desktop:

cd ~/Desktop
./server 51717
./client clientName 51717

Jest to dokładnie to samo zachowanie, jakie można zobaczyć w systemie Linux (lub innym systemie * ix).

Pamiętaj, że pliki powinny być oznaczone jako pliki wykonywalne, ale kompilator zwykle zrobi to za Ciebie.

Powodzenia!

Dave C.
źródło