使用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域套接字。你可以,但是,创建自己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()
起来。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句