Я довольно новичок в кодировании Unix и хотел бы поработать над несколькими простыми сетевыми проектами. Я нашел несколько уроков, которые именно то, что я ищу, - в частности, этот: http://www.linuxhowtos.org/C_C++/socket.htm.

Я выяснил, как скомпилировать серверные и клиентские файлы c в исполняемые файлы, и я могу запустить их в терминале следующим образом:

open server
open client

так как я использую Mac OS X 10.7.5. Моя проблема в том, что мне нужно передавать аргументы этим программам при их инициализации. Учебник использует этот код:

server 51717
client clientName 51717

но я не нашел способа воспроизвести это в моем терминале Mac.

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

Я нашел этот пост и создал яблочный скрипт с этим кодом

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

но это бросает кучу ошибок. Я попробовал много вариантов, но не смог заставить их бежать. Я также не смог заставить работать пример Chrome из этого поста (у меня не установлен FF).

Как передать простой целочисленный номер порта в качестве аргумента программе, как в учебнике? Это проще сделать на машине с Linux? У меня нет проблем с переключением ОС на этом этапе, и было бы идеально, если бы я мог использовать синтаксис «server 51717», который используется в учебнике, вместо того, чтобы создавать отдельный скрипт выполнения для каждой программы. Ищу ответ и совет. Благодарю.

РЕДАКТИРОВАТЬ:

Я заставил его работать правильно, но кое-что все еще не работает правильно. Я запускаю сервер так:

$ ./server 3456

затем откройте новый терминал и запустите клиент с ограниченным успехом:

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

Я могу запустить клиента с некоторыми комбинациями number.number, но он не работает для всех из них, и я не могу использовать какие-либо буквы. Почему работает только одно из этих решений?

РЕШЕНИЕ:

$ sudo nano /private/etc/hosts

добавьте 127.0.0.1 mClient внизу, затем нажмите Ctrl ^ o, чтобы сохранить

Теперь это работает:

$ ./client mClient 3456

2 ответа2

1

Просто запустите двоичный файл прямо из консоли - используя open на моем MacBook (10.8.4), "произвольные" двоичные файлы не могут быть открыты из открытого (open предназначен для использования файлового дескриптора для открытия файла в соответствующем приложении).

Так, например, если ваш сервер и клиентские двоичные файлы находятся в Desktop (~/Desktop), то их можно запустить из консоли с помощью:

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

Или локально в каталоге Desktop:

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

Это точно такое же поведение, как и в Linux (или любой другой системе * ix).

Обратите внимание, что файлы должны быть помечены как исполняемые, но компилятор обычно сделает это за вас.

Удачи!

1

Скомпилируйте код:

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

Запустите сервер без аргументов:

$ ./server
ERROR, no port provided

Запустите сервер с одним аргументом:

$ ./server 3456

В другом терминале:

$ ./client 3456
usage ./client hostname port  

сообщение об использовании указывает, как запустить двоичный файл, то есть, какие аргументы, чтобы дать ему

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

так как сервер прослушивает все интерфейсы, вы также можете использовать

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

поэтому аргументы - это строки, которые следуют за командой. В примере gcc есть 3 аргумента: server.c -o server

соответствующая часть кода (сервер):

portno = atoi(argv[1]);

argv - это вектор (массив), который содержит все аргументы, переданные команде в командной строке. Atoi преобразует строку в целое число.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .