5¡¢ÏûÏ¢¶ÓÁÐ
ÏûÏ¢¶ÓÁб£´æÔÚÄÚºËÖУ¬ÊÇÒ»¸öÓÉÏûÏ¢×é³ÉµÄÁ´±í¡£
(1)´´½¨»ò·ÃÎÊÏûÏ¢¶ÓÁÐ
int msgget(key_t key,int msgflg);
(2)²Ù×÷ÏûÏ¢¶ÓÁÐ
int msgsnd(int msqid,const void *msg,size_t nbytes,int msgflg);
msgÖ¸ÏòµÄ½á¹¹Ì屨ÐëÒÔÒ»¸ölong int³ÉÔ±¿ªÍ·£¬×÷Ϊmsgrcv()µÄÏûÏ¢ÀàÐÍ£¬±ØÐë´óÓÚ0¡£nbytesÖ¸µÄÊÇmsgÖ¸Ïò½á¹¹ÌåµÄ´óС£¬µ«²»°üÀ¨long int²¿·ÖµÄ´óС
ssize_t msgrcv(int msqid,void *msg,size_t nbytes,long msgtype,int msgflg);
Èç¹ûmsgtypeÊÇ0£¬¾Í·µ»ØÏûÏ¢¶ÓÁÐÖеĵÚÒ»¸öÏûÏ¢;Èç¹ûÊÇÕýÕûÊý£¬¾Í·µ»Ø¶ÓÁÐÖеĵÚÒ»¸ö¸ÃÀàÐ͵ÄÏûÏ¢;Èç¹ûÊǸºÊý£¬¾Í·µ»Ø¶ÓÁÐÖоßÓÐ×îСֵµÄµÚÒ»¸öÏûÏ¢£¬²¢ÇÒ¸Ã×îСֵҪСÓÚµÈÓÚmsgtypeµÄ¾ø¶ÔÖµ¡£
(3)¿ØÖÆÏûÏ¢¶ÓÁÐ
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
struct msqid_ds{
struct ipc_perm msg_perm;
…
};
6¡¢Socket
Ì×½Ó×Ö(Socket)ÊÇÓÉBerkeleyÔÚBSDϵͳÖÐÒýÈëµÄÒ»ÖÖ»ùÓÚÁ¬½ÓµÄIPC£¬ÊǶÔÍøÂç½Ó¿Ú(Ó²¼þ)ºÍÍøÂçÐÒé(Èí¼þ)µÄ³éÏó¡£Ëü¼È½â¾öÁËÎÞÃû¹ÜµÀÖ»ÄÜÔÚÏà¹Ø½ø³Ì¼äµ¥ÏòͨÐŵÄÎÊÌ⣬ÓÖ½â¾öÁËÍøÂçÉϲ»Í¬Ö÷»úÖ®¼äÎÞ·¨Í¨ÐŵÄÎÊÌâ¡£
¡¡¡¡Ì×½Ó×ÖÓÐÈý¸öÊôÐÔ:Óò(domain)¡¢ÀàÐÍ(type)ºÍÐÒé(protocol)£¬¶ÔÓ¦ÓÚ²»Í¬µÄÓò£¬Ì×½Ó×Ö»¹ÓÐÒ»¸öµØÖ·(address)À´×÷ΪËüµÄÃû×Ö¡£
¡¡¡¡Óò(domain)Ö¸¶¨ÁËÌ×½Ó×ÖͨÐÅËùÓõ½µÄÐÒé×壬×î³£ÓõÄÓòÊÇAF_INET£¬´ú±íÍøÂçÌ×½Ó×Ö£¬µ×²ãÐÒéÊÇIPÐÒé¡£¶ÔÓÚÍøÂçÌ×½Ó×Ö£¬ÓÉÓÚ·þÎñÆ÷¶ËÓпÉÄÜ»áÌṩ¶àÖÖ·þÎñ£¬¿Í»§¶ËÐèҪʹÓÃIP¶Ë¿ÚºÅÀ´Ö¸¶¨Ìض¨µÄ·þÎñ¡£AF_UNIX´ú±í±¾µØÌ×½Ó×Ö£¬Ê¹ÓÃUnix/LinuxÎļþϵͳʵÏÖ¡£
¡¡¡¡IPÐÒéÌṩÁËÁ½ÖÖͨÐÅÊÖ¶Î:Á÷(streams)ºÍÊý¾Ý±¨(datagrams)£¬¶ÔÓ¦µÄÌ×½Ó×ÖÀàÐÍ(type)·Ö±ðΪÁ÷ʽÌ×½Ó×ÖºÍÊý¾Ý±¨Ì×½Ó×Ö¡£Á÷ʽÌ×½Ó×Ö(SOCK_STREAM)ÓÃÓÚÌá¹©ÃæÏòÁ¬½Ó¡¢¿É¿¿µÄÊý¾Ý´«Êä·þÎñ¡£¸Ã·þÎñ±£Ö¤Êý¾ÝÄܹ»ÊµÏÖÎÞ²î´í¡¢ÎÞÖØ¸´·¢ËÍ£¬²¢°´Ë³Ðò½ÓÊÕ¡£Á÷ʽÌ×½Ó×ÖʹÓÃTCPÐÒé¡£Êý¾Ý±¨Ì×½Ó×Ö(SOCK_DGRAM)ÌṩÁËÒ»ÖÖÎÞÁ¬½ÓµÄ·þÎñ¡£¸Ã·þÎñ²¢²»Äܱ£Ö¤Êý¾Ý´«ÊäµÄ¿É¿¿ÐÔ£¬Êý¾ÝÓпÉÄÜÔÚ´«Êä¹ý³ÌÖжªÊ§»ò³öÏÖÊý¾ÝÖØ¸´£¬ÇÒÎÞ·¨±£Ö¤Ë³ÐòµØ½ÓÊÕµ½Êý¾Ý¡£Êý¾Ý±¨Ì×½Ó×ÖʹÓÃUDPÐÒé¡£
¡¡¡¡Ò»ÖÖÀàÐ͵ÄÌ×½Ó×Ö¿ÉÄÜ¿ÉÒÔʹÓöàÓÚÒ»ÖÖµÄÐÒéÀ´ÊµÏÖ£¬Ì×½Ó×ÖµÄÐÒé(protocol)ÊôÐÔÓÃÓÚÖ¸¶¨Ò»ÖÖÌØ¶¨µÄÐÒé¡£
¡¡¡¡(1) ´´½¨Ì×½Ó×Ö
|
int socket(int domain,int type,int protocol); |
¡¡¡¡¶ÔÓÚSOCK_STREAMºÍSOCK_DGRAM¶øÑÔ£¬·Ö±ðÖ»ÓÐÒ»ÖÖÐÒéÖ§³ÖÕâÖÖÀàÐ͵ÄÌ×½Ó×Ö¡£Òò´Ëprotocol¿ÉÒÔΪ0£¬±íʾĬÈϵÄÐÒé¡£
¡¡¡¡(2) °ó¶¨Ì×½Ó×Ö
|
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);//½«ÎÞÃûÌ×½Ó×ÖsockfdÓëaddr°ó¶¨(bind) |
¡¡¡¡(3) ¼àÌýÌ×½Ó×Ö
|
int listen(int sockfd,int backlog);//backlogÏÞ¶¨Á˵ȴý·þÎñµÄ¶ÓÁеÄ×î´ó³¤¶È |
¡¡¡¡(4) µÈ´ý½ÓÊÜÁ¬½Ó
|
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen); |
¡¡¡¡µ±¿Í»§¶Ë³ÌÐò³¢ÊÔÁ¬½ÓsockfdÌ×½Ó×Öʱ£¬accept·µ»ØÒ»¸öеÄÌ×½Ó×ÖÓë¿Í»§¶Ë½øÐÐͨÐÅ¡£Èç¹ûaddr²»ÊÇNULL£¬ÄÇô¿Í»§¶ËµÄµØÖ·½«»á±£´æÔÚaddrËùÖ¸ÏòµÄ½á¹¹ÌåÖУ»µ÷ÓÃaccept()ǰ±ØÐëÏȽ«addrlen³õʼ»¯ÎªaddrËùÖ¸Ïò½á¹¹ÌåµÄ´óС£¬accept()·µ»ØÒÔºó,addrlen½«»á±»ÉèÖóɿͻ§¶ËÌ×½Ó×ÖµØÖ·½á¹¹ÌåµÄʵ¼Ê´óС¡£È»ºó£¬Í¨¹ý¶Ôaccept()·µ»ØµÄÌ×½Ó×ÖÖ´ÐÐread()ºÍwrite()²Ù×÷¼´¿ÉʵÏÖÓë¿Í»§¶ËµÄ¼òµ¥µÄͨÐÅ¡£
¡¡¡¡(5) ½¨Á¢Á¬½Ó(¿Í»§¶Ë)
| ? |
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen); |
¡¡¡¡connect()ÔÚÎÞÃûÌ×½Ó×ÖsockfdºÍaddrÖ®¼ä½¨Á¢Á¬½Ó¡£addrÖ¸ÏòµÄ½á¹¹ÌåÖпÉÒÔ°üº¬·þÎñÆ÷µÄIPµØÖ·ºÍ¶Ë¿ÚºÅµÈÐÅÏ¢¡£
¡¡¡¡(6) Êý¾Ý´«Êä
|
ssize_t send(int sockfd,const void *buf,size_t len,int flags);
ssize_t recv(int sockfd, void *buf, size_t len,int flags); |
¡¡¡¡(7) ¹Ø±ÕÌ×½Ó×Ö
¡¡¡¡(8) Ö÷»ú×Ö½ÚÐòºÍÍøÂç×Ö½ÚÐòµÄת»»
|
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong); //host to network,long
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort); |
longÐͺ¯ÊýÓÃÀ´×ª»»sockaddr_in.in_addr.s_addr£»shortÐͺ¯ÊýÓÃÀ´×ª»»sockaddr_in.sin_port¡£
½ñÌìµÄ½²½â¾Íµ½ÕâÀïÁË£¬ÏëÒªÁ˽â»òÕßѧϰ¸ü¶à¡¢¸üÏêϸµÄÄÚÈÝ£¬»¶ÓÀ´µ½ÎÒÃÇÀÖÓã²¥¿ÍC/C++Åàѵר¼Ò(
http://www.itcast.cn/c/)À´×Éѯ¡¢Ñ§Ï°¡£
±¾ÎİæÈ¨¹éÀÖÓã²¥¿ÍC++Åàѵ
ѧԺËùÓУ¬»¶Ó×ªÔØ£¬×ªÔØÇë×¢Ã÷×÷Õß³ö´¦¡£Ð»Ð»£¡
×÷ÕߣºÀÖÓã²¥¿ÍC/C++ÅàѵѧԺ
Ê×·¢£ºhttp://www.itcast.cn/c/