我对 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 系统)上看到的行为完全相同。
请注意,文件需要标记为可执行文件,但编译器通常会为您执行此操作。
祝你好运!