通过fd将stdin,stdout发送到服务器并退出

时间:2018-07-15 13:51:37

标签: c linux sockets file-descriptor

我正在使用sftp客户端,该客户端必须通过本地套接字(/run/bfileserver/sftp.sock)连接到sftp服务器,并将fd的stdin和stdout传递到服务器。概述:

fuse/sftp/ssh ------ network ------ sshd
                                     |- bfileclient (stdin,stdout)
                                       |- bfileserver 
                                        (/run/bfileserver/sftp.sock)

bfileclient由openssh守护程序使用以下选项启动:

Subsystem          sftp  /home/sbon/Projects/bfile-client/bfileclient

sshd守护程序和bfileclient之间的通信通过这些文件描述符进行。 fd的这种传递有效,但是当我的sftp客户端退出时(它的工作完成:将defd传递给服务器),服务器收到的fd也关闭了。

fd的传递是使用位于以下位置的代码完成的: Ubuntu Linux send file descriptor with Unix Domain Socket

客户这样做:

struct sockaddr_un sun;
int fd=-1;
int sock=-1;

fd=socket(AF_UNIX, SOCK_STREAM, 0);
sun.sun_family=AF_UNIX;
snprintf(sun.sun_path, sizeof(sun.sun_path), "/run/bfileserver/sftp.sock");
connect(fd, (struct sockaddr *) &sun, sizeof(struct sockaddr_un));

sock=socket(AF_UNIX, SOCK_STREAM, 0);
dup2(sock, STDIN_FILENO);
dup2(sock, STDOUT_FILENO);
dup2(sock, STDERR_FILENO);

send_bfile_msg_fd(fd, sock); /* this uses the code mentioned */

close(sock);

服务器对连接的大小进行recvmsg:

fd=read_fd_msg(&msg);
where msg is the msghdr used to recvmsg.

fd是有效的文件描述符,但是在客户端终止时它将关闭。有人知道发生了什么事吗?

我知道我可以使用direct-streamlocal@openssh.com使sshd守护程序直接连接到/run/bfileserver/sftp.sock),但我希望bfileclient进行一些检查。

Stef

0 个答案:

没有答案