【问题标题】:What is the standard way of doing IP Networking in GNUstep?在 GNUstep 中进行 IP 网络的标准方法是什么?
【发布时间】:2014-02-21 20:39:46
【问题描述】:

我查看了似乎相关的类,但不清楚是否有一个与管道等效的用于 TCP/UDP 套接字的类。 Socket 类描述似乎不仅仅是做你需要做的事情来创建和绑定一个端口并设置监听。目前,我已经在直接的 unix 网络原语中实现了这一点……但如果我的 Socket 与 Pipe 真的是相同的 API,那就太好了。

其他人如何处理这个问题?我对 Socket 的作用有误解吗?

在这种情况下,我不想要复杂性,只是标准 IP 网络的标准 OO 覆盖。

【问题讨论】:

    标签: objective-c linux sockets gnustep


    【解决方案1】:

    我有一段时间没有使用 GNUstep,所以这是基于 Apple 的库,您需要确保没有任何差异。

    可以使用NSStream 上的类方法创建TCP 连接,该方法返回一个输入流和输出流进行通信。

    NSHost *host = ...;
    NSUInteger port = ...;
    NSInputStream *input;
    NSOutputStream *output;
    [NSStream getStreamsToHost:host port:port inputStream:&input
                                             outputStream:&output];
    

    对于其他连接,您可以使用标准 Unix API 创建连接,然后创建 NSFileHandle 来包装文件描述符。

    int fd = socket(...);
    NSFileHandle *fileHandle = [[NSFileHandle alloc] initWithFileDescriptor:fd
                                                             closeOnDealloc:YES];
    

    【讨论】:

    • 是的,我上次检查过,他们的基础相当不错,但那就像 8 年前一样......但是所有这些东西都是 8 年前的基础,所以......我认为任何在 OS X 或 GnuStep 中,您使用该层编写的代码应该几乎相同
    • 两个端口可以一样吗?我有一个应用程序级协议,它根据远程操作的成功返回 ACK 或 NAK 消息。 (它在 unix 调用上运行得相当好,所以我宁愿不改变。
    • @DaleAmon 如果你有很好的可移植 posix 代码工作,那么不要用 NSBlahBlah 包装器重写它......你不会得到任何东西。
    • @Dale 你的意思是让输入和输出流成为一个对象吗?不,你不能那样做。您可以使用文件句柄进行双向通信。但是套用 Grady 的话说,在 Objective-C 中使用 C 代码没有任何问题,所以如果您已经使用它,请随意保留它。
    • 库对象的优势在于,有人不断努力使它们更加稳定和防呆,同时保持稳定的 API……随着时间的推移,您无需更改代码即可获得更多功能。这就是为什么我希望在 Unix 网络上有稳定的覆盖。事实上,为什么应该有这样的能力。如果我仍然从事 25 年前的工作,那可能是我设计的第一件事,一个涵盖所有 Posix 和标准特性的抽象层。然后我会在上面分层一个更高级的抽象层。
    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2011-06-05
    • 2020-03-09
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多