如何访问其他进程的 socket 句柄?
来源:互联网 发布:小众香水 知乎 编辑:程序博客网 时间:2024/05/27 12:22
Recv file descriptor.
Send file descriptor.
代码:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
ssize_t recv_fd(int fd, void *ptr, size_t nbytes, int *recvfd)
{
struct msghdr msg;
struct iovec iov[1];
ssize_t n;
union {
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof (int))];
} control_un;
struct cmsghdr *cmptr;
msg.msg_control = control_un.control;
msg.msg_controllen = sizeof(control_un.control);
msg.msg_name = NULL;
msg.msg_namelen = 0;
iov[0].iov_base = ptr;
iov[0].iov_len = nbytes;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
if ((n = recvmsg(fd, &msg, 0)) <= 0)
return -1;
if ((cmptr = CMSG_FIRSTHDR(&msg)) != NULL &&
cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {
if (cmptr->cmsg_level != SOL_SOCKET)
return -1;
if (cmptr->cmsg_type != SCM_RIGHTS)
return -1;
*recvfd = *((int *) CMSG_DATA(cmptr));
} else {
*recvfd = -1;
}
return (n);
}
int main(int argc, char *argv[]) {
char c;
int fd, newfd;
struct sockaddr_un addr;
fd = socket(PF_UNIX, SOCK_STREAM, 0);
bzero(&addr, sizeof(addr));
addr.sun_family = PF_UNIX;
strcpy(addr.sun_path, "/tmp/fd.socket");
unlink("/tmp/fd.socket");
bind(fd, (struct sockaddr *)&addr, sizeof(addr));
listen(fd, 10);
while((newfd = accept(fd, NULL, 0)) >= 0) {
int recvfd;
recv_fd(newfd, &c, 1, &recvfd);
close(newfd);
/* Now, we get the file descriptor. */
}
}
Send file descriptor.
代码:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
ssize_t send_fd(int fd, void *ptr, size_t nbytes, int sendfd)
{
struct msghdr msg;
struct iovec iov[1];
union {
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
} control_un;
struct cmsghdr *cmptr;
msg.msg_control = control_un.control;
msg.msg_controllen = sizeof(control_un.control);
cmptr = CMSG_FIRSTHDR(&msg);
cmptr->cmsg_len = CMSG_LEN(sizeof(int));
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
*((int *) CMSG_DATA(cmptr)) = sendfd;
msg.msg_name = NULL;
msg.msg_namelen = 0;
iov[0].iov_base = ptr;
iov[0].iov_len = nbytes;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
return (sendmsg(fd, &msg, 0));
}
int main(int argc, char *argv[]) {
int fd, sendfd;
struct sockaddr_un addr;
fd = socket (PF_UNIX, SOCK_STREAM, 0);
bzero(&addr, sizeof(addr));
addr.sun_family = PF_UNIX;
strcpy(addr.sun_path, "/tmp/fd.socket");
connect(fd, (struct sockaddr *)&addr, sizeof(addr));
sendfd = open("/etc/inittab", O_RDONLY);
/* send a file descriptor. */
send_fd(fd, "", 1, sendfd);
return 0;
}
- 如何访问其他进程的 socket 句柄?
- spy++如何获得其他进程中的句柄
- 如何监控Windows进程的句柄资源
- 如何得到当前进程的句柄
- 如何得到一个进程的句柄
- Windows进程间共享socket与窗口句柄的体会
- Process 后, 如何获取打开窗口的句柄(根据进程句柄获取窗口句柄)
- 由于句柄值实际上是放入进程句柄表的索引,因此这些句柄 是与进程相关的,并且不能由其他进程成功地使用
- 已知进程句柄,如何知道此进程的主窗口句柄
- WPF 如何访问其他窗体的控件
- 如何访问其他apk的数据库
- 如何截获其他进程的消息响应函数
- 进程句柄的应用
- -进程的句柄
- 进程的实例句柄
- WIN32开发:如何获取父进程的句柄
- windows核心编程-进程的句柄和如何获得
- socket中套接字传递给其他进程的问题
- Linux 文件和目录的属性
- 兄弟的一些照片
- Linux 用户(User)查询篇
- struts-config.xml文件详解
- 对日合作WINCE C 开发工程师
- 如何访问其他进程的 socket 句柄?
- 使用Struts-config.xml来实现全局request编码转换
- Visual C#常用函数和方法集汇总
- ASP.NET - Code Samples - Disable CheckboxList Items
- Select()系统调用及文件描述符集fd_set的应用
- 对日合作C++/MFC开发工程师
- Select()函数
- Ip-adress.com:国际IP地址查询工具
- firebird