gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:01 24 4
gpt4 key购买 nike

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];

但是,是否可以创建和/或连接到 local domain socket这样,或者 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() 它。

关于objective-c - 如何在 Objective-C 中使用本地域套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22220743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com