在 Mac 终端中将参数传递给 Unix 可执行文件

在 Mac 终端中将参数传递给 Unix 可执行文件

我对 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

我找到了这个邮政并使用此代码创建了一个applescript

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

但这会引发一堆错误。我尝试了许多变体,但都无法运行。我也无法让该帖子中的 Chrome 示例运行(我没有安装 FF)。

如何像教程中一样将一个简单的整数端口号作为参数传递给程序?在 Linux 机器上这样做更容易吗?目前,我可以毫无问题地切换操作系统,如果我可以使用教程中使用的“服务器 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

答案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 将字符串转换为整数。

答案2

只需直接从控制台执行二进制文件 - 在我的 MacBook(10.8.4)上使用打开,“任意”二进制文件无法从打开中打开(打开意味着使用文件描述符在适当的应用程序中打开文件)。

例如,如果您的服务器和客户端二进制文件位于桌面(〜/ Desktop)中,那么可以使用以下命令从控制台执行它们:

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

或者在本地桌面目录中:

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

这与您在 Linux(或任何其他 *ix 系统)上看到的行为完全相同。

请注意,文件需要标记为可执行文件,但编译器通常会为您执行此操作。

祝你好运!

相关内容