在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。 下面先来看两个函数: #include <sys/types.h> #include <sys/socket.h> ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); ssize_t recvmsg(int sockfd, struct msghdr *msg...
#include<sys/types.h>#include<sys/socket.h>...ssize_trecvmsg(intsockfd,structmsghdr *msg,intflags); ...ssize_tsendmsg(intsockfd,conststructmsghdr *msg,intflags);structmsghdr{void*msg_name;// protocol addresssocklen_tmsg_namelen;// size of protocol addressstructiovec*msg_iov;// scatter/gat...
struct msghdr msg;...struct cmsghdr*cmsg=CMSG_FIRSTHDR(&msg);cmsg->cmsg_level=SOL_SOCKET;cmsg->cmsg_type=SCM_RIGHTS;//socket fd列表,设置在cmsg_data上int*fds=(int*)CMSG_DATA(cmsg); 依靠sendmsg函数,socket句柄就发送到另外一个进程了。 3. 接收和还原 同样的,recvmsg函数,将会接收这部分数据,...
前言:本文是socket-send发送源码分析文章的子篇,主要分析 tcp_sendmsg_locked 这个函数的源码逻辑。 对应实际调用代码:tcp_sendmsg # tcp_sendmsg_locked net\ipv4\tcp_ipv4.c # 3310 行 struct proto tcp_prot…
然后调用__sock_sendmsg,而__sock_sendmsg又调用UDP的sendmsg去做真正的发送。 也就是说,对于UDP的socket来说,sendto调用,真正去做工作的是udp_sendmsg这个函数。 int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t len) { struct inet_sock *inet = inet_sk(sk); ...
sendmsg系统调用将要从进程发送的消息复制到内核空间,并调用sendit()。在sendit()中,初始化一个结构,将进程的输出收集到内核的内存缓冲区中。地址和控制信息也会从进程复制到内核。然后调用sosend(),它执行四项任务: (1)根据sendit()函数传递的值初始化各种参数。
{this.socket=socket;try{in=newBufferedReader(newInputStreamReader(socket.getInputStream()));msg="用户:"+this.socket.getInetAddress()+"~加入了聊天室"+"当前在线人数:"+mList.size();this.sendmsg();}catch(IOExceptione){e.printStackTrace();}}@Overridepublicvoidrun(){try{while(true){if((msg...
继续分析udp_sendmsg, ipc.oif = sk->sk_bound_dev_if;err = sock_tx_timestamp(msg, sk, &ipc.shtx); if (err) return err; if (msg->msg_controllen) { err = ip_cmsg_send(sock_net(sk), msg, &ipc); if (err) return err; if (ipc.opt) ...
在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。 下面先来看两个函数: #include <sys/types.h> #include <sys/socket.h> ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); ...
2.sendmsg/recvmsg 3.UNIX域套接字传递描述符字 1.socketpair pipe匿名管道:半双工的,只能用于父子进程(通过共享文件描述符的方式来通信,因为子进程继承了父进程的fd),或者亲缘关系的进程间通信 会返回2个文件描述符 与pipe区别1:他是全双工的,其它一样 ...