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...