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

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ą.


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.