Programming °æ (¾«»ªÇø)

·¢ÐÅÈË: superman (·çÓêÎÞ×è), ÐÅÇø: Programming
±ê  Ìâ: ¼òµ¥µÄ Winsock Ó¦ÓóÌʽÉè¼Æ£¨3£©(fwd) (תÔØ)
·¢ÐÅÕ¾: ×϶¡Ïã (Thu Oct  9 21:55:49 1997)

¡¾ ÒÔÏÂÎÄ×ÖתÔØ×Ô Winsock ÌÖÂÛÇø ¡¿
¡¾ Ô­ÎÄÓÉ topcon Ëù·¢±í ¡¿
·¢ÐÅÕ¾: °×ɽºÚË® (Tue Apr 23 21:32:07 1996)

¼òµ¥µÄ Winsock Ó¦ÓóÌʽÉè¼Æ£¨3£©

        ÁÖ ¾ü Ø¾

ÔÚÇ°Á½ÆÚµÄÎÄÕÂÖУ¬±ÊÕß½éÉÜÁËÈçºÎÔÚ Winsock »·¾³Ï½¨Á¢Ö÷´Ó¼Ü¹¹µÄ
TCP Socket£¬ÒÔ¼°ÈçºÎÀûÓàSocket À´ÊÕËÍ×ÊÁÏ£»½ñÌ죬ÎÒÃǽÓÖøÀ´¿´Ò»¿´ÈçºÎ
ÀûÓàWinsock ËùÌṩµÄº¯Ê½À´È¡µÃһЩ»ù±¾µÄÍø·×ÊÁÏ£¬°üÀ¨ÎÒÃDZ¾ÉíÖ÷»úµÄ
Ãû³ÆÊÇʲ÷ᡢϵͳÖ÷¶¯Ö¸¶¨¸øÎÒÃǵĠSocket µÄ IP Î»Ö·¼° port number¡¢ÎÒÃǵÄ
Socket ËùÁ¬½ÓµÄ¶Ô·½ÊÇË­¡¢ÈçºÎ²éµÃijЩÖ÷»úµÄ IP Î»Ö·»òÃû³Æ¡¢ÒÔ¼°Ä³Ð©
well-known ·þÎñ£¨Èç ftp¡¢telnet µÈ£©ËùÓõĠport number ÊÇÄÄÒ»¸öµÈµÈ¡£

½ñÌìÎÒÃÇʹÓõÄչʾ³ÌʽÊDZÊÕßÒÔÇ°Ëù׫дµÄÒ»¸öÕë¶Ô Winsock 1.1 µÄ 46
¸öº¯Ê½×ö²âÊÔ»ò½ÌѧÓõijÌʽ£¬ÓÐÐËȤÁ˽â 46 ¸öº¯Ê½¸ÃÈçºÎºô½ÐµÄ¶ÁÕߣ¬¿ÉÓÃ
anonymous ftp ·½Ê½µ½ ¡¸tpts1.seed.net.tw¡¹ µÄ ¡¸UPLOAD/WINKING/JNLIN¡¹
Ŀ¼ÏÂÈ¡µÃ´Ë³ÌʽµÄÖ´Ðеµ¼°Ô­Ê¼³ÌʽÂ룬µµÃûΪ hello.*¡£¶ÁÕßÃÇÒ²¿ÉÀûÓÃ
hello ³ÌʽÀ´Ä£Äâ Server »ò Client ³Ìʽ£¬ÒÔÑéÖ¤ÎÒÃÇËù×öµÄ¶¯×÷¡£

¡¾ÈçºÎÖªµÀÎÒÃÇËùʹÓõĠlocal Ö÷»úÃû³Æ¡¿

ͨ³£ÎÒÃǶ¼»á°ïÎÒÃÇ×Ô¼ºËùʹÓõÄÕą̂Ö÷»úÉ趨һ¸öÃû³Æ£»ÔÚ³ÌʽÖУ¬ÎÒ
ÃÇÒ²¿ÉÒÔ͸¹ý Winsock ËùÌṩµÄÒ»¸ö³ÆΪ gethostname() µÄº¯Ê½À´È¡µÃÕâÒ»¸öÖ÷
»úÃû³Æ¡£

¡ò gethostname()£º»ñȡĿǰʹÓÃÕßʹÓõĠlocal host µÄÃû³Æ¡£
¸ñ  Ê½£º int PASCAL FAR gethostname( char FAR *name, int namelen );
²Î  Êý£º        name    ÓÃÀ´´æ·Å local host Ãû³ÆµÄÔÝ´æÇø
        namelen name µÄ´óС
´«»ØÖµ£º        ³É¹¦ - 0
        Ê§°Ü - SOCKET_ERROR (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ´Ëº¯Ê½ÓÃÀ´»ñÈ¡ local host µÄÃû³Æ¡£

ÔÚ³ÌʽÖÐÎÒÃǺô½ÐµÄ·½·¨ÈçÏ£º

gethostname( (char FAR *) hname, sizeof(hname) )

¶ÁÕßÃÇÈç¹ûʹÓùý Trumpet Winsock µÄ»°£¬¿ÉÄÜÖªµÀ Trumpet µÄ»·¾³É趨ÖÐ
²¢Ã»ÓÐÈÃÎÒÃÇÉ趨 local host Ãû³ÆµÄÀ¸Î»£¬ËùÒÔÔÚÖ´ÐÐһЩ Public Domain µÄ
Winsock Ó¦ÓóÌʽ£¨Èç ws_ping¡¢wintalk£©Ê±£¬ÔÚºô½Ð gethostname() Ê±»á²úÉú´í
Îó£»½â¾öµÄ·½·¨ÊÇÔÚ Trumpet µÄ ¡¸hosts¡¹ µµÖмÓÉÏÄúµÄÖ÷»ú IP Î»Ö·¼°Ãû³Æ£¬
ÄÇ÷áºô½ÐÕâ¸öº¯Ê½Ê±¾Í²»»áÔÙ²úÉú´íÎóÁË¡£

¡¾ÈçºÎµÃ֪ϵͳÖ÷¶¯Ö¸¶¨¸øÎÒÃǵĠIP Î»Ö·¼° port number¡¿

ÒÔÇ°µÄÎÄÕÂÖУ¬±ÊÕßÔøÌáµ½ Client ¶ËµÄ TCP Socket ÔÚºô½Ð connect() º¯Ê½È¥
Á¬½Ó Server ¶Ë֮ǰ£¬¿ÉÒÔºô½Ð bind() º¯Ê½À´Ö¸¶¨ Client ¶Ë Socket ËùÓõĠIP Î»Ö·
¼° port number£»µ«ÊÇÒ»°ã¶øÑÔ£¬ÎÒÃÇ Client ¶Ë²¢²»ÐèÒªºô½Ð bind() À´Ö¸¶¨Ìض¨
µÄ IP Î»Ö·¼° port number µÄ£¬¶øÊǽ»ÓÉϵͳÖ÷¶¯°ïÎÒÃǵĠSocket É趨 IP Î»Ö·¼°
port number £¨ºô½Ð connect() º¯Ê½Ê±£©¡£µ«ÊÇÎÒÃÇÈçºÎµÃ֪ϵͳָ¶¨ÁËʲ÷á IP
λַ¼° port number ¸øÎÒÃÇÄØ£¿Õâ¾ÍÒª½èÖú getsockname() Õâ¸öº¯Ê½ÁË¡£

¡ò getsockname()£º»ñÈ¡ Socket µÄ Local Î»Ö·¼° port number ×ÊÁÏ¡£
¸ñʽ£º int PASCAL FAR getsockname( SOCKET s,
        struct sockaddr FAR *name, int FAR *namelen );
²Î  Êý£º        s       Socket µÄʶ±ðÂë
        name    ´æ·Å´Ë Socket µÄ Local Î»Ö·µÄÔÝ´æÇø
        namelen name µÄ³¤¶È
´«»ØÖµ£º        ³É¹¦ - 0
        Ê§°Ü - SOCKET_ERROR (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ´Ëº¯Ê½ÊÇÓÃÀ´È¡µÃÒÑÉ趨λַ»òÒÑÁ¬½ÓÖ® Socket µÄ±¾¶Ëλַ×ÊÁÏ¡£Èô
ÊÇ´Ë Socket ±»É趨Ϊ INADDR_ANY£¬ÔòÐèµÈÕæÕý½¨Á¢Á¬½Ó³É¹¦áá²Å»á´«»ØÕýÈ·
µÄλַ¡£

ÔÚ³ÌʽÖкô½ÐµÄ·½·¨Îª£º

struct sockaddr_in sa;
int salen = sizeof(sa);
getsockname( sd, (struct sockaddr FAR *)&sa, &salen )

¡¾ÈçºÎÖªµÀºÍÎÒÃǵĠSocket Á¬½ÓµÄ¶Ô·½ÊÇË­¡¿

Á¬½ÓµÄ Socket ÊÇÓÐÁ½¶ËµÄ£¬ËùÒÔÏà¶Ô춠getsockname() º¯Ê½£¬Winsock Ò²Ìá
¹©ÁËÒ»¸ö getpeername() º¯Ê½£¬À´ÈÃÎÒÃÇ»ñµÃÓëÎÒÃÇÁ¬½ÓµÄ¶Ô·½µÄ IP Î»Ö·Óë port
number¡£

¡ò getpeername()£º»ñÈ¡Á¬½Ó³É¹¦Ö® Socket µÄ¶Ô·½ IP Î»Ö·¼° port number¡£
¸ñ  Ê½£º int PASCAL FAR getpeername( SOCKET s,
        struct sockaddr FAR *name, int FAR *namelen );
²Î  Êý£º        s       Socket µÄʶ±ðÂë
        name    ´¢´æÓë´Ë Socket Á¬½ÓµÄ¶Ô·½ IP Î»Ö·µÄÔÝ´æÇø
        namelen name µÄ³¤¶È
´«»ØÖµ£º        ³É¹¦ - 0
        Ê§°Ü - SOCKET_ERROR (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ´Ëº¯Ê½¿ÉÓÃÀ´È¡µÃÒÑÁ¬½Ó³É¹¦µÄ Socket µÄ±Ë¶Ë֮λַ×ÊÁÏ¡£

ºô½ÐµÄ·½Ê½ÈçÏ£º

struct sockaddr_in sa;
int salen = sizeof(sa);
getpeername( sd, (struct sockaddr FAR *)&sa, &salen )

ÏÖÔÚÎÒÃÇÈÔÈ»ÀûÓàWinKing À´µ±ÎÒÃǵĠWinsock Stack£¬²¢ÀûÓÃËüËùÌṩµÄ
¹¤¾ßÀ´¹Û²ì Sockets µÄÁ¬½á¼°×ÊÁÏÊÇ·ñÕýÈ·¡£

ÓÉͼ 1£¬ÎÒÃÇ¿ÉÒÔÓÉ WinKing µÄÊÓ´°¿´µ½ÎÒÃÇÉ趨Õą̂Ö÷»úµÄÃû³ÆÊÇ
¡¸vincent¡¹£¬IP Î»Ö·ÊÇ ¡¸140.92.61.24¡¹¡£ÎÒÃDz¢ÀûÓÃÁ½¸ö hello ³Ìʽ£¬Ò»¸öµ±
³É Client £¨»­ÃæÓұߴò¿ªÕߣ©£¬Ò»¸öµ±³É Server £¨»­Ãæ×ó±ß×îС»¯Õߣ©¡£Server
ËùÓõĠport number ÊÇ ¡¸7016¡¹£» Client ²¢Ã»Óкô½Ð bind() À´Ö¸¶¨ port
number£¬¶øÊǺô½Ð connect() Ê±ÓÉϵͳָ¶¨¡£

ÎÒÃǺô½Ð gethostname()£¬µÃµ½µÄ´ð°¸ÊÇ ¡¸vincent¡¹£»¶ø Client ºô½Ð
getsockname() µÃµ½×Ô¼ºµÄ IP Î»Ö·ÊÇ ¡¸140.92.61.24¡¹£¬port number ÊÇ ¡¸2110¡¹
£¨±ÊÕßÒÔÇ°ÔøÌá¹ý£¬ÓÉϵͳÖ÷¶¯Ö¸¶¨µÄ port number »á½é춠1024 µ½ 5000 ¼ä£©£»
ÔÙºô½Ð getpeername() µÃµ½Óë Client Á¬½ÓµÄ Server ¶Ë IP Î»Ö·ÊÇ ¡¸140.92.61.24¡¹
£¨ÒòΪÎÒÃǵĠClient ºÍ Server ¶¼ÔÚͬһ̨Ö÷»ú£©£¬port number ÊÇ ¡¸7016¡¹¡£¹û
Ȼû´í£¡£¨ÓÉ WinKing µÄ Sockets' Status ÊÓ´°Òà¿É¹Û²ìµ½Ï໥Á¬½ÓµÄ Sockets ×Ê
ÁÏ£¬ÓëÎÒÃǺô½Ðº¯Ê½ËùµÃ½á¹ûÏàͬ£©


£¨Í¼ 1£©ÀûÓàhello ³ÌʽÀ´Ä£Äâ Client ºÍ Server

¶ÁÕß±ØÐë×¢ÒâÒ»µã£¬getsockname() ¼° getpeername() ËùÈ¡µÃµÄ IP Î»Ö·¼° port
number ¶¼ÊÇ network byte order£¬¶ø²»ÊÇ host byte order£»Èç¹ûÄúÏëת³É host byte
order£¬¾Í±ØÐë½èÖú ntohl() ¼° ntohs() Á½¸öº¯Ê½¡£¶øÎÒÃÇÄÜ¿´µ½ IP Î»Ö·ÒÔ¡¸×Ö
´®¡¹·½Ê½±í´ï³öÀ´£¬ÔòÓÖÊÇÀûÓÃÁË inet_ntoa() º¯Ê½£»Ïà¶ÔµØ£¬ÎÒÃÇÒ²¿ÉÀûÓÃ
inet_addr() º¯Ê½½«×Ö´®·½Ê½µÄ IP Î»Ö·×ª»»³É in_addr ¸ñʽ£¨network byte order µÄ
unsigned long£©¡£

¡ò inet_ntoa()£º½«Ò»Íø·λַת»»³É¡¸µã¸ñʽ¡¹×Ö´®¡£
¸ñ  Ê½£º char FAR * PASCAL FAR inet_ntoa( struct in_addr in );
²Î  Êý£º        in      Ò»¸ö´ú±í Internet host Î»Ö·µÄ½á¹¹
´«»ØÖµ£º        ³É¹¦ - Ò»¸ö´ú±íλַµÄ¡¸µã¸ñʽ¡¹(dotted) ×Ö´®
        Ê§°Ü - NULL
˵Ã÷£º ´Ëº¯Ê½½«Ò» Internet Î»Ö·×ª»»³É¡¸a.b.c.d¡¹×Ö´®¸ñʽ¡£

¡ò inet_addr()£º½«×Ö´®¸ñʽµÄλַת»»³É 32 Î»Ôª in_addr µÄ¸ñʽ¡£
¸ñ  Ê½£º unsigned long PASCAL FAR inet_addr( const char FAR *cp );
²Î  Êý£º        cp      Ò»¸ö´ú±í IP Î»Ö·µÄ¡¸µã¸ñʽ¡¹(dotted) ×Ö´®
´«»ØÖµ£º        ³É¹¦ - Ò»¸ö´ú±í Internet Î»Ö·µÄ unsigned long
        Ê§°Ü - INADDR_NONE
˵Ã÷£º  ´Ëº¯Ê½½«Ò»¡¸µã¸ñʽ¡¹µÄλַ×Ö´®×ª»»³ÉÊÊÓÃÖ® Intenet Î»Ö·¡£
        ¡¸µã¸ñʽ¡¹×Ö´®¿ÉΪÒÔÏÂËÄÖÖ·½Ê½Ö®ÈÎÒ»£º
        (i) a.b.c.d  (ii) a.b.c  (iii) a.b  (iv) a

ͼ 1 µÄ hello ³ÌʽÖУ¬ÎÒÃǽ« Local ×ÊÁÏдµ½ dispmsg ÖУ¬ÔÙÏÔʾ³öÀ´£»Æä
Ó÷¨ÈçÏ£º

wsprintf((LPSTR)dispmsg, "OK! local ip=%s, local port=%d",
        inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));

¡¾Winsock ÌṩµÄ×ÊÁϿ⺯ʽ¡¿

Winsock Ò²ÌṩÁËͬ²½Óë·Çͬ²½µÄÍø·×ÊÁϿ⺯ʽ£»²»¹ý¶ÁÕßÃÇÒªÖªµÀ£¬´Ë
´¦µÄ×ÊÁÏ¿âÖ¸µÄ²¢·ÇÈç Informix, Oracle µÈÉÌÒµÓÃ;µÄ×ÊÁÏ¿âϵͳ£¬¶øÊÇÖ¸Ö÷»ú
IP Î»Ö·¼°Ãû³Æ¡¢well-known ·þÎñµÄÃû³Æ¼° Socket ÐÍ̬¼°ËùÓõĠport number¡¢
ÒÔ¼°Ð­¶¨£¨protocol£©Ãû³Æ¼°´úÂëµÈ¡£

¡¾Í¬²½×ÊÁϿ⺯ʽ¡¿

Ê×ÏÈÎÒÃÇÀ´¿´Ò»ÏµÚÒ»×飺gethostbyname() ¼° gethostbyaddr() º¯Ê½

ÕâÁ½¸öº¯Ê½µÄÓÃ;ÊÇÈÃÎÒÃÇ¿ÉÒÔÓÉij¸öÖ÷»úÃû³ÆÇóµÃËüµÄ IP Î»Ö·£¬»òÊÇÓÉ
ËüµÄ IP Î»Ö·ÇóµÃËüµÄÃû³Æ¡£Ò»°ãÎÒÃǾ­³£»áÓõ½µÄÊÇÓÉÃû³ÆÇóµÃ IP Î»Ö·£»Òò
ΪºÜÉÙÈË»áÈ¥¼Çij̨»úÆ÷µÄ IP Î»Ö·µÄ£¬ÁíÍâ TCP/IP ·â°üµÄ IP header ÉÏÒ²±ØÐë
¼ÇÔØËÍ¡¢ÊÕÖ÷»úµÄ IP Î»Ö·£¬¶ø²»ÊÇÖ÷»úÃû³Æ¡£

¡ò gethostbyname()£ºÀûÓÃijһ host µÄÃû³ÆÀ´»ñÈ¡¸Ã host µÄ×ÊÁÏ¡£
¸ñ  Ê½£º struct hostent FAR * PASCAL FAR
        gethostbyname( const char FAR *name );
²Î  Êý£º        name    host µÄÃû³Æ
´«»ØÖµ£º        ³É¹¦ - Ö¸ÏòÒ»¸ö hostent ½á¹¹µÄÖ¸±ê
        Ê§°Ü - NULL (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ´Ëº¯Ê½ÊÇÀûÓàhost Ãû³ÆÀ´»ñÈ¡¸ÃÖ÷»úµÄÆäËû×ÊÁÏ£¬Èç host µÄλַ¡¢
±ðÃû£¬Î»Ö·µÄÐÍ̬¡¢³¤¶ÈµÈ¡£

¡ò gethostbyaddr()£ºÀûÓÃijһ host µÄ IP Î»Ö·À´»ñÈ¡¸Ã host µÄ×ÊÁÏ¡£
¸ñ  Ê½£º struct hostent FAR * PASCAL FAR
        gethostbyaddr( const char FAR *addr, int len, int type );
²Î  Êý£º        addr    network ÅÅÁз½Ê½µÄλַ
        len     addr µÄ³¤¶È
        type    PF_INET(AF_INET)
´«»ØÖµ£º        ³É¹¦ - Ö¸ÏòÒ»¸ö hostent ½á¹¹µÄÖ¸±ê
        Ê§°Ü - NULL (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ´Ëº¯Ê½ÊÇÀûÓàIP Î»Ö·À´»ñÈ¡¸ÃÖ÷»úµÄÆäËû×ÊÁÏ£¬Èç host µÄÃû³Æ¡¢±ð
Ãû£¬Î»Ö·µÄÐÍ̬¡¢³¤¶ÈµÈ¡£

³ÌʽÖкô½ÐµÄ·½Ê½·Ö±ðÈçÏ£º

char host_name[30];
struct hostent far *htptr;
/* ¼ÙÉè host_name µÄÖµÒÑÏÈÉ趨ΪÎÒÃÇÒªÇóµÃ×ÊÁϵÄÖ÷»úÃû³Æ */
htptr = (struct hostent FAR *) gethostbyname( (char far *) host_name )

struct in_addr host_addr;
struct hostent far *htptr;
/* ¼ÙÉè host_addr µÄÖµÒÑÏÈÉ趨ΪÎÒÃÇÒªÇóµÃ×ÊÁϵÄÖ÷»úµÄnetwork byte
order ·½Ê½µÄ IP Î»Ö·*/
htptr = (struct hostent FAR *) gethostbyaddr((char far *)&host_addr, 4,
PF_INET)

Ò»°ãÑÔ£¬³ÌʽÖкô½Ðµ½ gethostbyname() ¼° gethostbyaddr() Ê±£¬Winsock
Stack »áÏÈÔÚ local µÄ ¡¸hosts¡¹µµÖÐÕÒ¿´¿´ÊÇ·ñÓÐÕâ¸öÖ÷»úµÄ×ÊÁÏ£»Èç¹ûûÓУ¬
Ôò¿ÉÄÜÔÙ͸¹ý¡¸ÁìÓòÃû³Æ·þÎñ¡¹£¨Domain Name Service£©µÄ¹¦ÄÜ£¬Ïò¡¸Ãû³ÆËÅ
·þÆ÷¡¹£¨Name Server£©²éѯ£»ËùÒÔºô½ÐÕâÁ½¸öº¯Ê½Ê±£¬ÓÐʱ»áµÈÒ»ÏÂ×ӲŻñµÃ
´ð¸²¡£Èç¹ûÄúÏëÈóÌʽִÐпìһЩµÄ»°£¬¿É½«³£ÓÃÖ÷»úµÄ×ÊÁÏ·ÅÔÚ hosts µµÖУ¬
ÕâÑù¾Í²»±Ø͸¹ý DNS È¥²éѯÁË¡£

½ÓÏÂÀ´ÎÒÃÇÀ´¿´ getservbyname() ¼° getservbyport() ÕâÁ½¸öº¯Ê½¡£

´ó²¿·ÝµÄ¶ÁÕßÓ¦¸Ã¶¼Óùý telnet¡¢mail¡¢ftp¡¢news µÈ·þÎñÓ¦ÓóÌʽ£»ÕâЩӦ
ÓóÌʽµÄЭ¶¨£¬±ÈÈç·þÎñÃû³Æ¡¢ËÅ·þÆ÷¶ËËùÓõĠport number¡¢ÒÔ¼° Socket µÄÐÍ
̬£¬¶¼Êǹ̶¨µÄ£»ÕâЩ×ÊÁÏ£¬ÎÒÃǾͿÉÒÔÀûÓàgetservbyname() »ò getservbyport()
À´È¡µÃ£¬¶ø²»±Ø¿ÌÒâÈ¥¼ÇËÌËüÃÇ¡£

¡ò getservbyname()£ºÒÀÕÕ·þÎñ (service) Ãû³Æ¼°Í¨Ñ¶Ð­¶¨£¨tcp/udp£©À´»ñÈ¡¸Ã
·þÎñµÄÆäËû×ÊÁÏ¡£
¸ñ  Ê½£º struct servent * PASCAL FAR
        getservbyname( const char FAR *name, const char FAR *proto );
²Î  Êý£º        name    ·þÎñÃû³Æ
        proto   Í¨Ñ¶Ð­¶¨Ãû³Æ
´«»ØÖµ£º        ³É¹¦ - Ò»Ö¸Ïò servent ½á¹¹µÄÖ¸±ê
        Ê§°Ü - NULL (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ÀûÓ÷þÎñÃû³Æ¼°Í¨Ñ¶Ð­¶¨À´»ñµÃ¸Ã·þÎñµÄ±ðÃû¡¢Ê¹ÓõĠport ºÅÂë
µÈ¡£

¡ò getservbyport()£ºÒÀÕÕ·þÎñ (service) µÄ port ºÅÂ뼰ͨѶЭ¶¨£¨tcp/udp£©À´
»ñÈ¡¸Ã·þÎñµÄÆäËû×ÊÁÏ¡£
¸ñ  Ê½£º struct servent * PASCAL FAR
        getservbyport( int port,  const char FAR *proto );
²Î  Êý£º        port    ·þÎñµÄ port ±àºÅ
        proto   Í¨Ñ¶Ð­¶¨Ãû³Æ
´«»ØÖµ£º        ³É¹¦ - Ò»Ö¸Ïò servent ½á¹¹µÄÖ¸±ê
        Ê§°Ü - NULL (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ÀûÓàport ±àºÅ¼°Í¨Ñ¶Ð­¶¨À´»ñµÃ¸Ã·þÎñµÄÃû³Æ¡¢±ðÃûµÈ¡£

³ÌʽÖеÄʹÓ÷½·¨·Ö±ðΪ:

char serv_name[20];
char proto[10];
struct servent far *svptr;
/* ¼ÙÉè serv_name ¼° proto ÒÑÏÈÉèºÃ·þÎñÃû³Æ¼°Í¨Ñ¶Ð­¶¨ */
svptr = (struct servent FAR *)getservbyname( (char far *)serv_name, (char far
*)proto )

int serv_port;
char proto[10];
struct servent far *svptr;
/* ¼ÙÉè serv_port ¼° proto ÒÑÏÈÉèºÃ·þÎñËùÓõĠport number ¼°Í¨Ñ¶Ð­¶¨ */
svptr = (struct servent FAR *)getservbyport( htons(serv_port), (char far
*)proto) )

Winsock »·¾³Ï£¬ÎÒÃÇÄܹ»²éѯµ½µÄ·þÎñ×ÊÁ϶¼ÊÇ´æ·ÅÔÚ local µÄ
¡¸services¡¹µµÖУ»Õâ¸öµµËù´æ·ÅµÄ¶¼ÊÇ well-known µÄ·þÎñ£¬»ù±¾ÉÏÎÒÃÇÊDz»Ðè
È¥¸ü¸ÄËüµÄ¡£¶ÁÕßÒ²¿ÉÒÔ½«×Ô¼ºÌṩµÄ·þÎñ¼Óµ½Õâ¸öµµÖУ¬²»¹ýÄúËùÓõķþÎñ
×ÊÁÏÒª¹«Öîì¶ÊÀ£¬²»È»±ðÈ˵Ġservices µµÖпÉÊÇûÓÐÄúµÄ·þÎñµÄ×ÊÁÏÓ´¡£

×îááµÄÕâ×é getprotobyname() ¼° getprotobynumber() º¯Ê½ÊÇÓÃÀ´È¡µÃһЩ
¡¸Ð­¶¨¡¹µÄ×ÊÁÏ£¬±ÈÈç tcp¡¢udp¡¢igmp µÈ¡£Ò»°ã¶øÑÔ£¬ÎÒÃÇÊDz»Ì«»áÓõ½µÄ¡£

¡ò getprotobyname()£ºÒÀÕÕͨѶЭ¶¨ (protocol) µÄÃû³ÆÀ´»ñÈ¡¸ÃͨѶЭ¶¨µÄÆä
Ëû×ÊÁÏ¡£
¸ñ  Ê½£º struct protoent FAR * PASCAL FAR
        getprotobyname( const char FAR *name );
²Î  Êý£º        name    Í¨Ñ¶Ð­¶¨Ãû³Æ
´«»ØÖµ£º        ³É¹¦ - Ò»Ö¸Ïò protoent ½á¹¹µÄÖ¸±ê
        Ê§°Ü - NULL (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ÀûÓÃͨѶЭ¶¨µÄÃû³ÆÀ´µÃÖª¸ÃͨѶЭ¶¨µÄ±ðÃû¡¢±àºÅµÈ×ÊÁÏ¡£

¡ò getprotobynumber()£ºÒÀÕÕͨѶЭ¶¨µÄ±àºÅÀ´»ñÈ¡¸ÃͨѶЭ¶¨µÄÆäËû×ÊÁÏ¡£
¸ñ  Ê½£º struct protoent FAR * PASCAL FAR
        getprotobynumber( int number );
²Î  Êý£º        number  ÒÔ host order ÅÅÁз½Ê½µÄͨѶЭ¶¨±àºÅ
´«»ØÖµ£º        ³É¹¦ - Ò»Ö¸Ïò protoent ½á¹¹µÄÖ¸±ê
        Ê§°Ü - NULL (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ÀûÓÃͨѶЭ¶¨µÄ±àºÅÀ´µÃÖª¸ÃͨѶЭ¶¨µÄÃû³Æ¡¢±ðÃûµÈ×ÊÁÏ¡£

³ÌʽÖкô½Ð·½Ê½·Ö±ðÈçÏ£º

struct protoent far *ptptr;
char proto_name[20];
/* ¼ÙÉè proto_name ÒÑÏÈÉèºÃЭ¶¨Ãû³Æ */
ptptr = (struct protoent FAR *)getprotobyname( (char far *)proto_name )

struct protoent far *ptptr;
int proto_num;
/* ¼ÙÉè proto_num ÒÑÏÈÉèºÃЭ¶¨±àºÅ */
ptptr = (struct protoent FAR *)getprotobynumber( proto_num )

Winsock Stack ¶Ôì¶Ó¦ÓóÌʽºô½Ð getprotobyname() ¼° getprotobynumber() µÄ
×ÊÁÏ£¬ÊÇÈ¡×Ô춠local µÄ¡¸protocol¡¹µµ£»ÈçÎÞÐèÒª£¬ÎÒÃÇÒ²²»ÓÃÈ¥±ä¸üÕâ¸öµµ
°¸µÄÄÚÈÝ¡£


        £¨Í¼ 2£©hello ³Ìʽºô½Ðͬ²½×ÊÁϿ⺯ʽ

¡¾·Çͬ²½×ÊÁϿ⺯ʽ¡¿

Winsock 1.1 Õë¶ÔÇ°Ãæ±ÊÕßËùÃèÊöµÄ 6 ¸öͬ²½×ÊÁϿ⺯ʽ£¬Ò²ÌṩÁËÏà¶ÔµÄ
6 ¸ö·Çͬ²½×ÊÁϿ⺯ʽ£¬ËüÃÇ·Ö±ðÊÇ WSAAsyncGetHostByName()¡¢
WSAAsyncGetHostByAddr()¡¢WSAAsyncGetServByName()¡¢
WSAAsyncGetServByPort()¡¢WSAAsyncGetProtoByName()¡¢
WSAAsyncGetProtoByNumber()¡£

ÓÉì¶ËüÃÇÈ¡µÃµÄ×ÊÁÏÓëͬ²½×ÊÁϿ⺯ʽÏàͬ£¬ËùÒÔ±ÊÕß½öÒÔ
WSAAsyncGetHostByName() ÎªÀý£¬ËµÃ÷ÕâЩ·Çͬ²½º¯Ê½£¬²¢¸æË߸÷λ¶ÁÕߣ¬Í¬
²½ºÍ·Çͬ²½×ÊÁϿ⺯ʽ²»Í¬µÄµØ·½¡£

ÓÉ×ÖÃæÀ´¿´£¬¡¸·Çͬ²½¡¹µÄÒâ˼¾ÍÊÇÎÒÃÇ·¢³öÎÊÌâʱ£¬²¢²»»áÂíÉϵõ½´ð
¸²£¬¶øµÈµ½ÏµÍ³È¡µ½×ÊÁÏʱÔÙ¸æÖªÎÒÃÇ¡£Ã»´í£¬ÕâЩ·Çͬ²½×ÊÁϿ⺯ʽµÄ×÷ÓÃ
¾ÍÊÇÕâÑù¡£ºÍ WSAAsyncSelect() º¯Ê½Ò»Ñù£¬ÎÒÃÇÒª¸æËß Winsock ÏµÍ³Ò»¸ö½ÓÊÜ
֪ͨѶϢµÄÊÓ´°¼°Ñ¶Ï¢´úÂ룬ÒÔ±ãϵͳ֪ͨÎÒÃÇ¡£

ÎÒÃǺô½Ðͬ²½×ÊÁϿ⺯ʽʱ£¬return ÖµÊÇÒ»¸öÖ¸µ½Ïà¶Ô×ÊÁϵÄÔÝ´æÇø£¬¶øÕâ
¸ö×ÊÁÏÔÝ´æÇøÊÇÓÉϵͳËùÌṩµÄ£»µ«ÊǺô½Ð·Çͬ²½×ÊÁϿ⺯ʽʱ£¬ÎÒÃDZØÐë×Ô
¼º×¼±¸×ÊÁÏÔÝ´æÇø£¬²¢½«´ËÔÝ´æÇøµÄλַµ±³É²ÎÊý£¬´«¸øϵͳ£¬ÒÔ±ãϵͳÓÃÀ´
´¢´æÈ¡µ½µÄ×ÊÁÏ¡£¶ÁÕßÃDZØÐëÌرð×¢ÒâÒ»µã£ºÔÚϵͳ֪ͨ×ÊÁÏÈ¡µÃ³É¹¦»òʧ°Ü
Ç°£¬Ç§Íò²»¿É½«´«¸øϵͳµÄ×ÊÁÏÔÝ´æÇøɾ³ýÊÍ·Å£¬²»È»µ±ÏµÍ³È¡µÃ×ÊÁÏҪдÈë
ʱ£¬×ÊÁÏÇøÒѲ»¼ûÁË£¬»áµ¼ÖÁµ±»úµÄ¡£³ý´ËÖ®Í⣬×ÊÁÏÔÝ´æÇøµÄ´óСһ¶¨Òª¹»
´ó£¬²Å×ã¹»ÈÃϵͳÓÃÀ´´æ·ÅÈ¡µÃµÄ×ÊÁÏ¡££¨Winsock ¹æ¸ñÖеĽ¨ÒéÖµÊÇ
MAXGETHOSTSTRUCT 1024 bytes ´óСµÄÔÝ´æÇø£¬±ÊÕßÈÏΪ̫´óÁË£¬100 byets
²î²»¶à¾ÍÌ«¹»ÁË£

ºô½Ð·Çͬ²½×ÊÁϿ⺯ʽʱ£¬µÃµ½µÄ return ÖµÊÇÒ»¸ö´úÂ룬´Ë´úÂë´ú±íµÄ¾Í
ÊÇ´ËÏîºô½ÐÔÚϵͳÄڵıàºÅ£»ÓÉì¶ÊÇ·Çͬ²½£¬ËùÒÔÎÒÃÇÔڵõ½´ð°¸Ç°£¬ÈԿɺô
½Ð WSACancelAsyncRequest() º¯Ê½À´È¡ÏûÔ­Ïȵĺô½Ð£¬Õâ¸öÈ¡ÏûµÄ¶¯×÷¾ÍÒªÀû
Óõ½¸Ã´úÂëÁË¡£ÁíÍ⣬µ±ÎÒÃÇÊÕµ½½á¹û֪ͨʱ£¬wParam µÄÖµÒ²ÊÇÕâ¸ö´úÂ룻ÎÒ
ÃÇ´Ëʱ¿ÉÒÔÀûÓàWSAGETASYNCERROR(lParam) À´µÃÖª×ÊÁÏÈ¡µÃÊdzɹ¦»òʧ
°Ü£»Èç¹ûʧ°ÜµÄÔ­ÒòÊÇÔ­ÏÈ´«ÈëµÄÔÝ´æÇø̫СµÄ»°£¬ÎÒÃÇÒà¿ÉÀûÓÃ
WSAASYNCGETBUFLEN(lParam) À´µÃÖªÖÁÉÙÒª¶à´óµÄÔÝ´æÇø²Å¹»¡£

¡ò WSAAsyncGetHostByName()£ºÀûÓÃijһ host µÄÃû³ÆÀ´»ñÈ¡¸Ã host µÄ×Ê
ÁÏ¡£(·Çͬ²½·½Ê½)
¸ñ  Ê½£º HANDLE PASCAL FAR WSAAsyncGetHostByName( HWND hWnd,
        unsigned int wMsg, const char FAR *name, char FAR *buf,  int
buflen );
²Î  Êý£º        hWnd    ¶¯×÷Íê³Éáᣬ½ÓÊÜѶϢµÄÊÓ´° handle
        wMsg    ´«»ØÊÓ´°µÄѶϢ
        name    host Ãû³Æ
        buf     ´æ·Å hostent ×ÊÁϵÄÔÝ´æÇø
        buflen  buf µÄ´óС
´«»ØÖµ£º        ³É¹¦ - ´ú±í´Ë·Çͬ²½¶¯×÷µÄ handle ´úÂë
        Ê§°Ü - 0  (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ´Ëº¯Ê½ÊÇÀûÓàhost Ãû³ÆÀ´»ñÈ¡ÆäËûµÄ×ÊÁÏ£¬Èç host µÄλַ¡¢±ðÃû£¬
λַµÄÐÍ̬¡¢³¤¶ÈµÈ¡£Ê¹ÓÃÕߺô½Ð´Ëº¯Ê½Ê±±ØÐë´«ÈëÒª½ÓÊÕ×ÊÁϵÄÊÓ´° handle¡¢
ѶϢ´úÂë¡¢×ÊÁϵĴæ·Åλַָ±êµÈ£¬ÒÔ±ãµÃµ½×ÊÁÏʱ¿ÉÒÔ֪ͨ¸ÃÊÓ´°À´Ê¹ÓÃ×Ê
ÁÏ¡£ºô½Ð´Ëº¯Ê½áá»áÂíÉϻص½Ê¹ÓÃÕߵĺô½Ðµã²¢´«»ØÒ»¸ö handle ´úÂ룬´Ë´úÂë
¿ÉÓÃÀ´±æ±ð´Ë·Çͬ²½¶¯×÷»òÓÃÀ´È¡Ïû´Ë·Çͬ²½¶¯×÷¡£µ±×ÊÁÏÈ¡µÃáᣬϵͳ»áËÍÒ»
¸öѶϢµ½Ê¹ÓÃÕßÖ¸¶¨µÄÊÓ´°¡£

¡ò WSACancelAsyncRequest()£ºÈ¡ÏûijһδÍê³ÉµÄ·Çͬ²½ÒªÇó¡£
¸ñ  Ê½£º int PASCAL FAR WSACancelAsyncRequest( HANDLE
hAsyncTaskHandle );
²Î  Êý£ºhAsyncTaskHandle        ÒªÈ¡ÏûµÄ task handle ´úÂë
´«»ØÖµ£º        ³É¹¦ - 0
        Ê§°Ü - SOCKET_ERROR (ºô½Ð WSAGetLastError() ¿ÉµÃÖªÔ­Òò)
˵Ã÷£º ´Ëº¯Ê½ÊÇÓÃÀ´È¡ÏûÔ­ÏȺô½Ðµ«ÉÐδÍê³ÉµÄWSAAsyncGetXByY()£¬Àý
Èç WSAAsyncGetHostByName()£¬µÄ¶¯×÷¡£²ÎÊý hAsyncTaskHandle ¼´Îªºô½Ð
WSAAsyncGetXByY() Ê±´«»ØÖ®´úÂëÖµ¡£ÈôÊÇÔ­ÏȺô½ÐÖ®·Çͬ²½ÒªÇóÒѾ­Íê³É£¬
ÔòÎÞ·¨¼ÓÒÔÈ¡Ïû¡£


        £¨Í¼ 3£©hello ³Ìʽºô½Ð·Çͬ²½×ÊÁϿ⺯ʽ

¡¾½áÓï¡¿

±ÊÕßÒѾ­Îª¸÷λ½éÉÜÁ˴󲿷ݠWinsock Ó¦ÓóÌʽÉè¼Æʱ»áÓõ½µÄº¯Ê½£¬²»
Öª¶ÁÕßÖÐÊÇ·ñÒÑÓÐÈË¿ªÊ¼Á·Ï°×Ô¼ºÐ´ Winsock Íø·³ÌʽÁËÂð£¿ÏÂÒ»ÆÚ£¬±ÊÕß»á
½«Ê£Ïµĺ¯Ê½¶¼½éÉÜÍê¡£Ôٴ˱ÊÕß²¢ÆÚ´ý¸÷λ³ýÁËʹÓñðÈËÉè¼ÆµÄÍø·ÈíÌå
Í⣬´ó¼ÒÒ²¶¼ÄÜ×Ô¼ºÁ·Ï°Éè¼Æ³öһЩ²»´íµÄÍø·ӦÓÃÈíÌ壬ÈÃÊÀ½çÆäËû¹ú¼ÒµÄ
ÈËÖªµĄ̀ÍåÒ²ÓÐÄÜÈ˵ģ»Ô¸¹²ÃãÖ®¡£

--
¡ù À´Ô´:£®°×ɽºÚË® bbs.neu.edu.cn£®[FROM: beaver]

--
¡ù À´Ô´:¡¤¹þ¶û±õ×϶¡ÏãÕ¾ bbs1.hit.edu.cn¡¤[FROM: bbs@conger.neu.edu.c] 
[°Ù±¦Ïä] [·µ»ØÊ×Ò³] [Éϼ¶Ä¿Â¼] [¸ùĿ¼] [·µ»Ø¶¥²¿] [Ë¢ÐÂ] [·µ»Ø]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
Ò³ÃæÖ´ÐÐʱ¼ä£º210.218ºÁÃë