Übergeben Sie Argumente an Unix, das im Mac-Terminal ausführbar ist

0

Ich bin ziemlich neu in der Unix-Codierung und würde gerne an ein paar einfachen Netzwerkprojekten arbeiten. Ich habe ein paar Tutorials gefunden, die genau das sind, wonach ich suche - insbesondere dieses: http://www.linuxhowtos.org/C_C++/socket.htm .

Ich habe herausgefunden, wie man die Server- und Client-C-Dateien in ausführbare Dateien kompiliert, und ich kann sie im Terminal wie folgt ausführen:

open server
open client

seit ich Mac OS X 10.7.5 benutze Mein Problem ist, dass ich Argumente an diese Programme übergeben muss, wenn ich sie initialisiere. Das Tutorial verwendet diesen Code:

server 51717
client clientName 51717

Aber ich habe keine Möglichkeit gefunden, dies in meinem Mac-Terminal zu replizieren.

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

ich habe das gefunden Post und erstellte ein AppleScript mit diesem Code

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

aber das wirft eine Reihe von Fehlern auf. Ich habe viele Variationen ausprobiert, konnte aber keine zum Laufen bringen. Ich konnte das Chrome-Beispiel von diesem Beitrag auch nicht zum Laufen bringen (ich habe FF nicht installiert).

Wie übergebe ich dem Programm eine einfache Integer-Port-Nummer als Argument, wie im Tutorial beschrieben? Ist das auf einem Linux-Rechner einfacher? Ich habe kein Problem damit, die Betriebssysteme zu wechseln, und es wäre ideal, wenn ich die Syntax 'server 51717' verwenden könnte, die im Lernprogramm verwendet wird, anstatt für jedes Programm ein separates Ausführungsskript erstellen zu müssen. Auf der Suche nach einer Antwort und einem Rat. Vielen Dank.

BEARBEITEN:

Ich habe es richtig laufen lassen, aber etwas funktioniert immer noch nicht richtig. Ich starte den Server so:

$ ./server 3456

Öffnen Sie dann ein neues Terminal und starten Sie den Client mit begrenztem Erfolg:

$ ./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

Ich kann den Client mit einigen Zahlenkombinationen starten, aber es funktioniert nicht für alle und ich kann keine Buchstaben verwenden. Warum funktioniert nur eine dieser Lösungen?

LÖSUNG:

$ sudo nano /private/etc/hosts

hinzufügen 127.0.0.1 mClient nach unten und drücken Sie dann Strg ^ o, um zu speichern

Das funktioniert jetzt:

$ ./client mClient 3456
Cbas
quelle
Müssen Sie offen verwenden? Können Sie die Binärdatei nicht einfach direkt ausführen, z. cd ins verzeichnis mit drin und dann ./server 51717?
Dave C
Ich muss open nicht verwenden, ich wusste nicht, dass ich exes direkt aufrufen kann (ich habe '$ server' ausprobiert, aber das hat nicht funktioniert, also habe ich angenommen, dass ich eine run-Funktion benötige). Ich habe immer noch Probleme beim Laufen Der Client akzeptiert jedoch keine Zeichenfolgen als Hostnamen
Cbas
1
Also ist mClient Ihr Hostname? Führen Sie eine DNS-Suche durch (ich gehe davon aus, dass dies der Fall ist, da der Fehler kein derartiger Host ist). In welchem ​​Fall ist er vorhanden und funktioniert er für Ihren Client? Was passiert, wenn Sie mClient anpingen?
Dave C
Das war das Problem, ich wusste nicht, dass ich den Alias ​​in Hosts definieren muss, bevor ich ihn verwende. Vielen Dank
Cbas

Antworten:

1

Kompilieren Sie den Code:

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

Führen Sie den Server ohne Argumente aus:

$ ./server
ERROR, no port provided

Führen Sie den Server mit einem Argument aus:

$ ./server 3456

In einem anderen Terminal:

$ ./client 3456
usage ./client hostname port  

Eine Verwendungsmeldung gibt an, wie eine Binärdatei ausgeführt werden soll. Dies sind die Argumente, die angegeben werden müssen

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

Da der Server alle Schnittstellen abhört, können Sie auch verwenden

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

Argumente sind also Zeichenfolgen, die dem Befehl folgen. Im gcc-Beispiel gibt es 3 Argumente: server.c -o server

Der relevante Teil des Codes ist (Server):

portno = atoi(argv[1]);

argv ist der Vektor (Array), der alle Argumente enthält, die an der Eingabeaufforderung für einen Befehl angegeben wurden. atoi konvertiert einen String in eine Ganzzahl.

Ярослав Рахматуллин
quelle
Die Verwendung einer IP-Adresse als Hostname scheint das einzige zu sein, was zu funktionieren scheint. Ein Beispiel finden Sie in meiner Bearbeitung
Cbas
Sie müssen einen echten DNS-Server oder Aliase / etc / hosts einrichten, damit benutzerdefinierte Namen funktionieren. Ich wette mit localhost funktioniert auch, weil es auf 127.0.0.1 eingestellt ist, auch Ihre lokale IP-Adresse (192.168.0.13 oder so).
Ярослав Рахматуллин
Oh, danke, es macht jetzt Sinn. Ich habe einen Alias ​​in die hosts-Datei eingefügt und es funktioniert.
Cbas
1

Führen Sie die Binärdatei einfach direkt von der Konsole aus - mit open auf meinem MacBook (10.8.4) können "beliebige" Binärdateien nicht von open aus geöffnet werden (open soll einen Dateideskriptor zum Öffnen einer Datei in der entsprechenden Anwendung verwenden).

Wenn sich Ihre Server- und Client-Binärdateien beispielsweise in Desktop (~ / Desktop) befinden, können sie von der Konsole aus ausgeführt werden:

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

Oder lokal im Desktop-Verzeichnis:

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

Dies ist genau das gleiche Verhalten wie unter Linux (oder einem anderen * ix-System).

Beachten Sie, dass die Dateien als ausführbar markiert werden müssen, der Compiler dies jedoch normalerweise für Sie erledigt.

Viel Glück!

Dave C
quelle