AF_UNIX
(Unix域套接字)时,是否有在从未调用listen()
的进程中调用bind()
的应用程序?在我的系统编程讲座和实验中,我们被指示在Unix域套接字客户端进程上调用
bind()
。在仅客户端Unix域套接字进程上调用bind有没有任何已记录、未记录或实际应用?据我所知,bind()
创建特殊的套接字文件,这是服务器进程要承担的责任。这样说对吗?这里是一个基于课堂讨论的概念的示例代码:
server.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main() {
int s0, s1;
struct sockaddr sa0 = {AF_UNIX, "a"};
s0 = socket(AF_UNIX, SOCK_STREAM, 0);
bind(s0, &sa0, sizeof(sa0) + sizeof("a"));
listen(s0, 1);
for (;;) {
s1 = accept(s0, NULL, NULL);
puts("connected!");
for (;;) {
char text[1];
ssize_t n = read(s1, &text, sizeof(text));
if (n < 1) {
break;
}
putchar(text[0]);
}
close(s1);
}
close(s0);
unlink("a");
return 0;
}
client.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main() {
int s0;
struct sockaddr sa0 = {AF_UNIX, "b"};
struct sockaddr sa1 = {AF_UNIX, "a"};
socklen_t sa1_len;
s0 = socket(AF_UNIX, SOCK_STREAM, 0);
bind(s0, &sa0, sizeof(sa0) + sizeof("b")); // What does this do??
connect(s0, &sa1, sizeof(sa1) + sizeof("b"));
for (;;) {
int c = fgetc(stdin);
if (c == EOF) {
break;
}
write(s0, &c, sizeof(c));
}
close(s0);
unlink("b");
return 0;
}
bind
调用有任何有用的作用,但我可能忘记了某些东西,这就是为什么这不是一个答案的原因。它绝对不是“必需的”,您可以通过从客户端程序中删除它来自行观察。 - zwolb
的套接字文件,如果我在运行时删除它,服务器仍然可以正常读取客户端。而且客户端不需要bind()
也可以工作。 - Winny