程序間SOCKET控制代碼傳遞 程序池應用

2021-04-18 17:06:29 字數 1858 閱讀 9404

1。函式及結構介紹

開發通訊程式,經常遇到服務程式的開發,常見使用程序池及執行緒池,下面介紹一對在程序池應用非常有用的函式,sendmsg/recvmsg,可以通過這組函式在程序中傳遞socket描述符。可以在主程序使用多路復用偵聽socket事件,將讀寫事件控制代碼傳遞給工作程序進行處理。

在使用函式前先來看一看下面的結構

struct msghdr ;

msg_name,msg_namelen指向位址指標,用於套介面未連線場合如upd套接字,如果無需指明協議位址如tcp協議,msg_name通常為null;

msg_iov,msg_iovlen指定輸入輸出緩衝區陣列及長度;

msg_control, msg_controllen指定可選輔助資料的位置及大小,也稱為控制資訊;

msg_flags 只有recvmsg使用msg_flags成員,recvmsg被呼叫時,flags引數被拷貝到msg_flags成員,sendmsg忽略此成員,因為它使用flags引數驅動傳送處理過程;

在使用recvmsg/sendmsg傳遞socket描述符時,msg_control成員指向的緩衝區被填以乙個cmsghdr的結構:

struct cmsghdr

下表列出輔助資料的各種用途:

協議

cmsg_level

cmsg_type

說明

tcp

sol_socket

scm_rights

scm_creds

傳送/接必描述符,轉交控制權

傳送/接收使用者憑證

ipv4

ipproto_ip

ip_recvdstaddr

ip_recvif

隨udp資料報接收宿位址

隨upd資料報接收介面索引

ipv6

ipproto_ipv6

ipv6-dstopts

ipv6-hoplimit

ipv6-hopopts

ipv6-nexthop

ipv6-pktinfo

ipv6-rthdr

ipv6-tclass

指定/接收目的位址選項

指定/接收跳限

指定/接收步跳選項

指定/接收分組資訊

指定/接收接收路由頭部

指定/接收分組流通類別

巨集定義cmsg_data指向與cmsghdr結構關聯的資料的指標

函式:ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

2。例子**

例子:寫socket描述符:

#define controllen sizeof (struct cmsghdr) + sizeof (int)

int send_fd (int sockfd, int fd)

else

} else

}return 0;

}讀socket描述符:

int recv_fd( int sockfd )

else

} else

}return *(int *) cmsg_data (cmptr);

}另外,傳出socket描述符的程序當傳出成功時需關閉socket描述符。

3。應用

程序間socket描述符傳遞一般應用在程序池中,父子程序通過socketpair建立用於程序間通訊的管理套接字,父程序偵聽埠,當有連線時accept後將此sockfd傳遞給工作子程序。由子程序從此sockfd接收資料進行處理。處理完成後通過管理套接字通知父程序。

程序間傳遞socket的做法

我們知道父程序在子程序被fork出來之前開啟的檔案描述符是能被子程序繼承下來的,但是一旦子程序已經建立後,父程序開啟的檔案描述符要怎樣才能傳遞給子程序呢?unix提供相應的技術來滿足這一需求,這就是同一臺主機上程序間的檔案描述符傳遞,很美妙而且強大的技術。想象一下我們試圖實現乙個伺服器,接收多個客戶...

DuplicateHandle程序間控制代碼複製

1 bool duplicatehandle handle hsourceprocesshandle,handle hsourcehandle,handle htargetprocesshandle,lphandle lptargethandle,dword dwdesiredaccess,bool...

Socket程序間通訊

int socket int domain,int type,int protocol int bind int sockfd,const struct sockaddr addr,socklen t addrlen struct sockaddr in internet address.struc...