利用Unix域套接字實現IPC

2021-06-04 22:02:04 字數 2619 閱讀 3494

寫完後,至少除錯了30分鐘時間。

錯誤1:

snprintf(argsockfd, sizeof(argsockfd), "%d", sockfd[1]);

snprintf(argmode, sizeof(argmode), "%d", mode);

寫作:snprintf(argsockfd, sizeof(argsockfd), "%s", sockfd[1]);

snprintf(argmode, sizeof(argmode), "%s", mode);

錯誤2: msg.msg_control = unc;

msg.msg_controllen = sizeof(unc);

忘記初始化

疑點3:如果不斷跳轉到recvmsg,總是可以接收,並沒有阻塞?不知道什麼原因,明天再看看

解決:由於recvmsg返回為0時,表示tcp對端已經傳送了fin。此時應當退出

#include "unp.h"

#define unc un.control

int my_open(const char *name, int mode);

int my_read(int fd, int *argfd);

int main(int argc, char **argv)

int my_open(const char *name, int mode)

/*parent程序*/

close(sockfd[1]);

waitpid(tid, &status, 0);

#ifdef debug

sleep(5);

#endif

if(my_read(sockfd[0], &fd) < 0)/*讀取描述符*/

return -1;

close(sockfd[0]);

return fd;

}int my_read(int fd, int *argfd)un;

struct iovec iov[1];

iov[0].iov_base = buf;

iov[0].iov_len = 1;

bzero(&msg, sizeof(msg));

msg.msg_name = null;

msg.msg_namelen = 0;

msg.msg_iov = iov;

msg.msg_iovlen = 1;

msg.msg_control = unc;

msg.msg_controllen = sizeof(unc);

= 0;

again:

if((n = recvmsg(fd, &msg, 0)) <= 0)

free(buf);

buf = null;

#ifdef debug

printf("recv is complete %d\n", n);

goto again;

#endif

cmsg = cmsg_firsthdr(&msg);

if(cmsg == null)

if(cmsg->cmsg_len != cmsg_len(sizeof(int)))

if((cmsg->cmsg_level == sol_socket)&&(cmsg->cmsg_type == scm_rights))

else

*argfd = -1;

return 0;

}/*示範1*/

#include "unp.h"

#define unc un.control

int my_write(int openfd, int fd);

int main(int argc, char **argv)

int my_write(int openfd, int fd)un;

*c = 'a';

iov[0].iov_base = c;

iov[0].iov_len = 1;

bzero(&msg, sizeof(msg));

msg.msg_control = unc;

msg.msg_controllen = sizeof(unc);

cmsg = cmsg_firsthdr(&msg);

cmsg->cmsg_len = cmsg_len(sizeof(int));

cmsg->cmsg_level = sol_socket;

cmsg->cmsg_type = scm_rights;

*(int *)cmsg_data(cmsg) = fd;

msg.msg_name = null;

msg.msg_namelen = 0;

msg.msg_iov = iov;

msg.msg_iovlen = 1;

msg.msg_flags = 0;

again:

if((n = sendmsg(openfd, &msg, 0) ) < 0)

//sleep(5);

free(c);

c = null;

return 0;

}

unix域套接字 IPC

沒用過域套接字,一般都用管道來進行程序通訊,不過聽說域套接字比管道好。就試試吧。域套接字在socket函式建立的時候,第二個字段,可以是sock stream,也可以是sock dgram。可是在用sock dgram建立接收端的時候,我發現,它可以不用listen和accept過程,直接接收就可以...

UNIX 網路IPC套接字

unix高階環境程式設計 linux秉承著萬物皆檔案的思想,把套接字也弄成了以檔案描述符形式描述的的檔案。1.int socket int domain,int type,int protocol domain分af inet,af inet6,af unix,af upspec 未指定 type分...

UNIX域套接字程式設計

unix 域套接字 uds unix domain socket。unix域協議並不是乙個實際的協議族,而是在單個主機上執行客戶 伺服器通訊的一種方式,單個主機上執行通訊,也就是所謂的進行間通訊 ipc 所以unix域套接字協議可以視作ipc方法之一。unix域提供兩中套接字api 位元組流套接字 ...