如何在Objective-C中使用本地域套接字

黑暗骑士

使用Objective-C可以很容易地将网络套接字与流一起使用,例如:

// Setup comms with the server, assumed to be running on the local host
NSHost* host = [NSHost hostWithAddress:@"127.0.0.1"];

NSInputStream *iStream;
NSOutputStream *oStream;

[NSStream getStreamsToHost:host port:_PORT inputStream: &iStream outputStream: &oStream];

但是,是否可以通过这种方式创建或连接到本地域套接字,或者Objective-C是否为此提供其他类?

如果仍然可以使用NSStream和getStreamsToHost,我将如何指定文件,以及将什么作为端口号?

到目前为止,我对此的研究显示了许多可用于TCP / IP或UDP的示例,但不适用于本地域套接字。

阿拉斯泰尔

您不能将其-getStreamsToHost:port:inputStream:outputStream:用于UNIX域套接字。你可以,但是,创建自己NSInputStreamNSOutputStream实例; 最简单的方法是利用之间的免费桥接的CF(Read|Write)StreamNS(Input|Output)Stream; 例如:

struct sockaddr_un sun;

sun.sun_family = AF_UNIX;
strcpy (sun.sun_path, "/path/to/my/socket");
sun.sun_len = SUN_LEN(&sun);

// Server side (naive)
int server_sock = socket (SOCK_UNIX, SOCK_STREAM, 0);
int ret = bind (server_sock, (struct sockaddr *)&sun, sun.sun_len);

listen (server_sock, 1);               // In practice you'd specify more than 1

s = accept (server_sock, NULL, NULL);  // In practice you want to keep calling this

// Client side
int s = socket (SOCK_UNIX, SOCK_STREAM, 0);

int ret = connect (s, (struct sockaddr *)&sun, sun.sun_len);

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocket (kCFAllocatorDefault, s, &readStream, &writeStream);

然后得到一个NSInputStreamNSOutputStream你可以做

NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputSteram *)outputStream;

显然,实际上,您可能希望将以上所有内容包装在自己的代码中的函数或方法中。另外,请注意sockaddr_unsun_path成员可能应该具有1024个字符,但标头中似乎只有104个字符(这是一个长期存在的问题,显然可以追溯到BSD4.4;某些系统在此处也具有其他字符计数)。这是遥不可及的PATH_MAX,因此在实践中您不妨编写更多类似的内容

struct sockaddr_un *new_unix_addr (const char *path) {
  size_t len = strlen (path);
  size_t bytes = sizeof (struct sockaddr_un) + len + 1
                 - sizeof (((struct sockaddr_un *)0)->sun_path);
  struct sockaddr_un *pun = (struct sockaddr_un *)malloc (bytes);

  pun->sun_family = AF_UNIX;
  pun->sun_len = bytes;
  memcpy (pun->sun_path, path, len + 1);
  return pun;
}

回想free()起来。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 Objective C 中使用 CallKit

来自分类Dev

如何在C ++中使用套接字(UDP)在LAN上查找服务器

来自分类Dev

如何在 C 中使用 TCP 套接字发送 size_t 变量?

来自分类Dev

如何在Swift中使用名称为Objective-C的类作为关键字

来自分类Dev

如何在Python ssl套接字缓冲中使用select?

来自分类Dev

如何在Python中使用套接字创建通道

来自分类Dev

如何在套接字中使用raw_input

来自分类Dev

如何在Python中使用套接字创建通道

来自分类Dev

如何在Python和子进程中使用套接字?

来自分类Dev

如何在Objective-C中使用后台线程?

来自分类Dev

如何在Objective C / XCode中使用CImg?

来自分类Dev

如何在Objective C中使用HSV缩放颜色

来自分类Dev

如何在Objective C中使用* .so库?

来自分类Dev

如何在Swift中使用Objective-C枚举

来自分类Dev

如何在Objective-C中使用GLKMatrixStack?(GLKit)

来自分类Dev

如何在Objective-C中使用此枚举?

来自分类Dev

如何在objective c 中使用json web 服务?

来自分类Dev

如何在iphone中使用objective c创建嵌套目录?

来自分类Dev

如何在 Objective C 中使用 JS Context SetObject

来自分类Dev

如何在objective c ios中使用multipart上传图像?

来自分类Dev

如何在 Objective-C 中使用存储属性

来自分类Dev

如何在 Objective C 中使用 Safari 打开表单?

来自分类Dev

如何在Objective C中使用托管对象?

来自分类Dev

如何在Objective C中存储块?

来自分类Dev

如何使用Java套接字编程获取本地端口

来自分类常见问题

如何在基于块的API方法中使用非空和可空的Objective-C关键字

来自分类Dev

使用NSStream进行Objective-C套接字编程

来自分类Dev

如何配置phoenix以在PostgreSQL中使用套接字

来自分类Dev

如何在Objective C中的类方法上使用self

Related 相关文章

  1. 1

    如何在 Objective C 中使用 CallKit

  2. 2

    如何在C ++中使用套接字(UDP)在LAN上查找服务器

  3. 3

    如何在 C 中使用 TCP 套接字发送 size_t 变量?

  4. 4

    如何在Swift中使用名称为Objective-C的类作为关键字

  5. 5

    如何在Python ssl套接字缓冲中使用select?

  6. 6

    如何在Python中使用套接字创建通道

  7. 7

    如何在套接字中使用raw_input

  8. 8

    如何在Python中使用套接字创建通道

  9. 9

    如何在Python和子进程中使用套接字?

  10. 10

    如何在Objective-C中使用后台线程?

  11. 11

    如何在Objective C / XCode中使用CImg?

  12. 12

    如何在Objective C中使用HSV缩放颜色

  13. 13

    如何在Objective C中使用* .so库?

  14. 14

    如何在Swift中使用Objective-C枚举

  15. 15

    如何在Objective-C中使用GLKMatrixStack?(GLKit)

  16. 16

    如何在Objective-C中使用此枚举?

  17. 17

    如何在objective c 中使用json web 服务?

  18. 18

    如何在iphone中使用objective c创建嵌套目录?

  19. 19

    如何在 Objective C 中使用 JS Context SetObject

  20. 20

    如何在objective c ios中使用multipart上传图像?

  21. 21

    如何在 Objective-C 中使用存储属性

  22. 22

    如何在 Objective C 中使用 Safari 打开表单?

  23. 23

    如何在Objective C中使用托管对象?

  24. 24

    如何在Objective C中存储块?

  25. 25

    如何使用Java套接字编程获取本地端口

  26. 26

    如何在基于块的API方法中使用非空和可空的Objective-C关键字

  27. 27

    使用NSStream进行Objective-C套接字编程

  28. 28

    如何配置phoenix以在PostgreSQL中使用套接字

  29. 29

    如何在Objective C中的类方法上使用self

热门标签

归档