我正在使用UNIX域套接字将文件描述符传输到另一个进程。 这工作正常,但是当我第一次尝试查看套接字是否使用select()写入时,sendmsg()调用将失败,并显示错误文件描述符错误。
sendmsg()函数与select()结合使用,如果不向msghdr结构添加文件描述符信息,那么冲突似乎在select()和传输文件描述符之间。
我在select(),recvmsg()或其他的手册页上找不到任何有关这方面的信息。 由于这需要成为一个服务器把文件描述符交给多个进程,我仍然希望能够使用select()。
有什么我可以做的这个工作,或者有没有人知道替代解决scheme?
cURL请求从Unix的套接字
java BufferedReader在Windows上,而不是在Mac上
寻找一个最简单(也是最快)的用于windows,c或c ++的TCP套接字编程的例子
我如何在C中find一个端口可以自由使用?
pyInstaller:导入错误
平台是Ubuntu 10.4。
这是初始化结构的代码:
struct cmsghdr_fd : public cmsghdr { int fd; }; int sendfd(int sock,int fd) { struct msghdr hdr; struct iovec data; struct cmsghdr_fd msgdata; char dummy = '*'; data.iov_base = &dummy; data.iov_len = sizeof(dummy); hdr.msg_name = NULL; hdr.msg_namelen = 0; hdr.msg_iov = &data; hdr.msg_iovlen = 1; hdr.msg_flags = 0; hdr.msg_control = &msgdata; hdr.msg_controllen = sizeof(msgdata); struct cmsghdr* cmsg = CMSG_FirsTHDR(&hdr); cmsg->cmsg_len = hdr.msg_controllen; cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; *(int*)CMSG_DATA(cmsg) = fd; int n = sendmsg(sock,&hdr,0); if(n == -1) printf("sendmsg() Failed: %s (socket fd = %d)n",strerror(errno),sock); return n; }
再说一遍,只要我不首先调用select()来检查套接字是否准备好写入就行了。
在C ++ Linux中的套接字超时
良好的Linux TCP / IP监视工具,不需要root权限?
如何在Windows上模拟socket.socketpair
便携式C ++ 11的方式同时等待一个套接字和布尔variables
操作不允许:SO_BINDTODEVICE的Server-setsockopt()错误
我尝试了这个页面上的sendfd代码,这是由nos提供的,虽然它只是稍微有点不同,但是它与select()一起使用时也能正常工作。 这就是代码现在的样子:
int sendfd(int sock,int fd) { struct msghdr hdr; struct iovec data; char cmsgbuf[CMSG_SPACE(sizeof(int))]; char dummy = '*'; data.iov_base = &dummy; data.iov_len = sizeof(dummy); memset(&hdr,sizeof(hdr)); hdr.msg_name = NULL; hdr.msg_namelen = 0; hdr.msg_iov = &data; hdr.msg_iovlen = 1; hdr.msg_flags = 0; hdr.msg_control = cmsgbuf; hdr.msg_controllen = CMSG_LEN(sizeof(int)); struct cmsghdr* cmsg = CMSG_FirsTHDR(&hdr); cmsg->cmsg_len = CMSG_LEN(sizeof(int)); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; *(int*)CMSG_DATA(cmsg) = fd; int n = sendmsg(sock,sock); return n; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。