- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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 域套接字,不。但是,您可以创建自己的 NSInputStream
和 NSOutputStream
实例;最简单的方法是利用 CF(Read|Write)Stream
和 NS(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);
然后得到一个 NSInputStream
和 NSOutputStream
你可以这样做
NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputSteram *)outputStream;
显然,在实践中,您可能希望将上述所有内容包装在您自己代码中的函数或方法中。另外,请注意 sockaddr_un
; sun_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/
我是一名优秀的程序员,十分优秀!