LinuxϵͳÌṩÁËһϵÁÐÇ¿´óµÄ¹¤¾ßÀ´ÊµÏÖÕâһĿ±ê£¬ÆäÖÐ`recvfrom`º¯ÊýÔÚUDPͨÐÅÖÐÓÈΪ¹Ø¼ü
È»¶ø£¬Ä¬ÈÏÇé¿öÏ£¬`recvfrom`ÊÇÒ»¸ö×èÈûº¯Êý£¬ÕâÒâζ×ÅÔÚûÓÐÊý¾Ýµ½´ïʱ£¬Ëü»áµÈ´ýÊý¾Ý£¬´Ó¶ø¿ÉÄܵ¼Ö³ÌÐòµÄÏìÓ¦ËÙ¶ÈϽµ
ΪÁËÌá¸ß³ÌÐòµÄÐÔÄܺÍÏìÓ¦ËÙ¶È£¬½«`recvfrom`ÉèÖÃΪ·Ç×èÈûģʽÏÔµÃÓÈÎªÖØÒª
±¾ÎĽ«ÉîÈë̽ÌÖÈçºÎÔÚLinuxϵͳÖÐʹÓÃ`recvfrom`½øÐзÇ×èÈû²Ù×÷£¬²¢½âÎöÆä±³ºóµÄÔÀíºÍÓ¦ÓÃ
Ò»¡¢recvfromº¯Êý»ù´¡ `recvfrom`º¯ÊýÊÇLinuxϵͳÖÐÓÃÓÚ´ÓÌ×½Ó×Ö½ÓÊÕÊý¾ÝµÄº¯Êý£¬ÆäÔÐÍÈçÏ£º ssize_t recvfrom(int sockfd,void buf, size_t len, int flags, structsockaddr src_addr, socklen_taddrlen); - `sockfd`£ºÒª½ÓÊÕÊý¾ÝµÄÌ×½Ó×ÖÃèÊö·û
- `buf`£ºÖ¸ÏòÓÃÓÚ´æ´¢½ÓÊÕÊý¾ÝµÄ»º³åÇøµÄÖ¸Õë
- `len`£º»º³åÇøµÄ´óС
- `flags`£º½ÓÊÕÑ¡Ïͨ³£ÉèÖÃΪ0£¬µ«Ò²¿ÉÒÔʹÓÃ`MSG_WAITALL`¡¢`MSG_PEEK`¡¢`MSG_DONTWAIT`µÈ±êÖ¾
- `src_addr`£ºÖ¸ÏòÒ»¸ö½á¹¹Ì壬ÓÃÓÚ´æ´¢·¢ËÍ·½µÄµØÖ·ÐÅÏ¢
- `addrlen`£ºÖ¸ÏòÒ»¸ö±äÁ¿£¬ÓÃÓÚ´æ´¢`src_addr`½á¹¹ÌåµÄ´óС£¬ÔÚµ÷ÓÃǰӦÉèÖÃΪ¸Ã½á¹¹ÌåµÄ´óС£¬ÔÚµ÷Óúó»á±»¸üÐÂΪʵ¼ÊʹÓõĴóС
`recvfrom`Ö÷ÒªÓÃÓÚUDPͨÐÅ£¬ÒòΪUDPÊÇÎÞÁ¬½ÓµÄ£¬Ã¿´Î½ÓÊÕÊý¾Ýʱ¶¼ÐèÒªÖªµÀÊý¾ÝµÄÀ´Ô´
ÕâÒ»ÌØÐÔʹµÃ`recvfrom`ÔÚ¹¹½¨ÐèÒª´¦Àí¶à¸ö¿Í»§¶ËÇëÇóµÄ·þÎñʱ·Ç³£ÓÐÓã¬ÒòΪËüÔÊÐí½ÓÊÕÀ´×ÔÈκεØÖ·µÄÊý¾Ý
¶þ¡¢·Ç×èÈûI/OµÄ¸ÅÄî ÔÚÉîÈë`recvfrom`µÄ·Ç×èÈû²Ù×÷֮ǰ£¬Àí½â·Ç×èÈûI/OµÄ¸ÅÄîÊDZØÒªµÄ
·Ç×èÈûI/OÊÇÖ¸ÒÔÒì²½·½Ê½Ö´Ðк¯Êý£¬¼´ÏÈÖ´ÐÐͬ²½ÈÎÎñ£¬½«ºÄʱÈÎÎñ·ÅÔÚʼþ¶ÓÁÐÖУ¬ÒÔ´ËÂÖѯִÐÐ
ÕâÖÖ»úÖÆ±ÜÃâÁ˳ÌÐòÔڵȴýI/O²Ù×÷ʱ×èÈû£¬´Ó¶øÌá¸ßÁ˳ÌÐòµÄÏìÓ¦ËٶȺÍÐÔÄÜ
ÔÚLinuxÖУ¬·Ç×èÈûI/Oͨ³£Í¨¹ýÉèÖÃÌ×½Ó×ÖµÄÊôÐÔÀ´ÊµÏÖ
¶ÔÓÚ`recvfrom`º¯Êý£¬ÕâÒâζ×ÅÐèÒª½«ÆäÌ×½Ó×ÖÉèÖÃΪ·Ç×èÈûģʽ
Èý¡¢ÉèÖÃrecvfromΪ·Ç×èÈûģʽ Òª½«`recvfrom`ÉèÖÃΪ·Ç×èÈûģʽ£¬ÐèÒª°´ÕÕÒÔϲ½Öè²Ù×÷£º 1.´´½¨Ì×½Ó×Ö£º ʹÓÃ`socket`º¯Êý´´½¨Ò»¸öÌ×½Ó×Ö
ÀýÈ磺 c int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 2.ÉèÖÃÌ×½Ó×ÖΪ·Ç×èÈûģʽ£º ʹÓÃ`fcntl`º¯ÊýÉèÖÃÌ×½Ó×ֵıê־룬½«ÆäÉèÖÃΪ·Ç×èÈûģʽ
¿ÉÒÔͨ¹ýÒÔÏ´úÂëʵÏÖ£º c int flags =fcntl(sockfd,F_GETFL, 0); fcntl(sockfd, F_SETFL, flags |O_NONBLOCK); »òÕߣ¬¸ü¼ò½àµÄ·½Ê½ÊÇÖ±½ÓÉèÖ㺠c fcntl(sockfd, F_SETFL,O_NONBLOCK); ÕâÁ½¶Î´úÂë¶¼Äܽ«Ì×½Ó×ÖÉèÖÃΪ·Ç×èÈûģʽ£¬Çø±ðÔÚÓÚǰÕßÏÈ»ñÈ¡µ±Ç°±ê־룬ÔÙÌí¼Ó`O_NONBLOCK`±êÖ¾£¬ºóÕßÔòÖ±½ÓÉèÖÃ
3.ʹÓÃrecvfromº¯Êý½ÓÊÕÊý¾Ý£º ÔÚ·Ç×èÈûģʽÏ£¬µ÷ÓÃ`recvfrom`º¯Êýʱ£¬Èç¹ûûÓÐÊý¾Ýµ½´ï£¬º¯Êý»áÁ¢¼´·µ»Ø£¬²¢ÉèÖÃ`errno`Ϊ`EWOULDBLOCK`»ò`EAGAIN`£¬±íʾ²Ù×÷½«»á×èÈû
ÕâÔÊÐí³ÌÐòÔÚûÓÐÊý¾Ý¿É¶ÁʱִÐÐÆäËûÈÎÎñ£¬´Ó¶øÌá¸ßÐÔÄÜ
ÀýÈ磺 c charbuffer¡¾1024¡¿; structsockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); ssize_tnum_bytes = recvfrom(sockfd, buffer, sizeof(buffer),0, (structsockaddr )&client_addr, &addr_len); if(num_bytes < { if(errno