Ê×Ò³ Ê«´Ê ×Öµä °å±¨ ¾ä×Ó ÃûÑÔ ÓÑ´ð ÀøÖ¾ ѧУ ÍøÕ¾µØÍ¼
µ±Ç°Î»ÖÃ: Ê×Ò³ > ½Ì³ÌƵµÀ > ¿ª·¢ÓïÑÔ > ±à³Ì >

UNIXѧϰ֮· Ò»²½Ò»¸ö½ÅÓ¡¶ùÖ®socket±à³Ì/SocketµÄ²ÎÊý

2013-04-07 
UNIXѧϰ֮· Ò»²½Ò»¸ö½ÅÓ¡Ö®socket±à³Ì/SocketµÄ²ÎÊý1.´´½¨Socket.×¢ÒⲻͬµÄϵͳϲÎÊý²»Ò»¶¨Ïàͬ£¬ÕâÀï

UNIXѧϰ֮· Ò»²½Ò»¸ö½ÅÓ¡Ö®socket±à³Ì/SocketµÄ²ÎÊý

1.´´½¨Socket.

×¢ÒⲻͬµÄϵͳϲÎÊý²»Ò»¶¨Ïàͬ£¬ÕâÀïÁгöÁËËùÓÐÒªÇóµÄ²ÎÊý¿ÉÓÃ值¡£

ÁíÍâ×¢ÒⲻͬµÄ°æ±¾¿ÉÒÔʹÓõIJÎÊýÒ²²»Ïàͬ£¬¿ÉÒԲο¼Ïà¹ØÎĵµ

²ÎÊýa.µØÖ·×壨ÓëTCP/IPЭÒéϵÄЭÒé×åµÈ¼Û£©¿ÉÒÔʹÓõIJÎÊýÈçÏÂ

#define AF_UNIX         1               /* local to host (pipes, portals) */

#define AF_INET         2               /* internetwork: UDP, TCP, etc. */

#define AF_IMPLINK      3               /* arpanet imp addresses */

#define AF_PUP          4               /* pup protocols: e.g. BSP */

#define AF_CHAOS        5               /* mit CHAOS protocols */

#define AF_NS           6               /* XEROX NS protocols */

#define AF_IPX          AF_NS           /* IPX protocols: IPX, SPX, etc. */

#define AF_ISO          7               /* ISO protocols */

#define AF_OSI          AF_ISO          /* OSI is ISO */

#define AF_ECMA         8               /* european computer manufacturers */

#define AF_DATAKIT      9               /* datakit protocols */

#define AF_CCITT        10              /* CCITT protocols, X.25 etc */

#define AF_SNA          11              /* IBM SNA */

#define AF_DECnet       12              /* DECnet */

#define AF_DLI          13              /* Direct data link interface */

#define AF_LAT          14              /* LAT */

#define AF_HYLINK       15              /* NSC Hyperchannel */

#define AF_APPLETALK    16              /* AppleTalk */

#define AF_NETBIOS      17              /* NetBios-style addresses */

#define AF_VOICEVIEW    18              /* VoiceView */

#define AF_FIREFOX      19              /* Protocols from Firefox */

#define AF_UNKNOWN1     20              /* Somebody is using this! */

#define AF_BAN          21              /* Banyan */

#define AF_ATM          22              /* Native ATM Services */

#define AF_INET6        23              /* Internetwork Version 6 */

#define AF_CLUSTER      24              /* Microsoft Wolfpack */

#define AF_12844        25              /* IEEE 1284.4 WG AF */

#define AF_MAX          26

AF_UNIX //±íʾUnixÄÚ²¿Ð­Òé

AF_NS //±íʾʹÓõÄÊÇXerox NSЭÒé×å

AF_IMPLINK//±íʾ IMP Á¬½Ó²ã

ÁíÍâAF_LOCALÊÇÓÃÓÚUnix/LinuxϵͳÖб¾»ú½ø³Ì¼äͨÐÅ

 

²ÎÊýb.SocketÀàÐÍ

¿ÉÒÔÈ¡ÈçϵÄһЩ值£º

SOCK_STREAM Á÷Ì×½Ó×Ö

SOCK_DGRAM Êý¾Ý±¨Ì×½Ó×Ö

SOCK_RAW Î´¼Ó¹¤Ì×½Ó×Ö£¨¿ÉÒÔÓÃËüÀ´½ÓÊÕԭʼµÄÊý¾Ý°ü£¬¼´²»¾­¹ý´«Êä²ãµÄ£¬³£ÓÃÀ´×¥°ü£©

SOCK_SEQPACKET Ë³Ðò°üÌ×½Ó×Ö

#define SOCK_STREAM     1               /* stream socket */

#define SOCK_DGRAM      2               /* datagram socket */

#define SOCK_RAW        3               /* raw-protocol interface */

#define SOCK_RDM        4               /* reliably-delivered message */

#define SOCK_SEQPACKET  5               /* sequenced packet stream */

 

²ÎÊýc.SocketʹÓõÄЭÒéÀàÐÍ

ͨ³£½«´ËÉèΪ0¼´IPPROTO_IP£¬ÊÇÒòΪЭÒéÀàÐÍ¿ÉÒÔ¸ù¾ÝSocketµÄÀàÐÍÀ´È·¶¨£¬±ÈÈçSock_STREAM¾ÍÊÇʹÓÃTCPЭÒ飬¶øSOCK_DGRAM¾ÍÊÇʹÓÃUDPЭÒé¡£

ÆäËûµÄÀàÐÍ»¹ÓÐ:

#define IPPROTO_ICMP            1               /* control message protocol */

#define IPPROTO_IGMP            2               /* internet group management protocol */

#define IPPROTO_GGP             3               /* gateway^2 (deprecated) */

#define IPPROTO_TCP             6               /* tcp */

#define IPPROTO_PUP             12              /* pup */

#define IPPROTO_UDP             17              /* user datagram protocol */

#define IPPROTO_IDP             22              /* xns idp */

#define IPPROTO_ND              77              /* UNOFFICIAL net disk proto */

#define IPPROTO_RAW             255             /* raw IP packet */

#define IPPROTO_MAX             256

2£®°ó¶¨

°ó¶¨ÊÇΪsocket¸³ÓèÒ»¸öÃû×Ö£¬ÒòΪ¸Õ´´½¨µÄsocketÊÇûÓÐÃû×ֵģ¬Ãû×Ö°üÀ¨Ê¹ÓõĵØÖ·×壬ipµØÖ·£¬¶Ë¿ÚºÅµÈ¡£

²ÎÊýa.socket,¼´ÐèÒª°ó¶¨µ«ÉÐδ°ó¶¨µÄsocket

²ÎÊýb.°ó¶¨µÄÃû³Æ£¬ÀàÐÍΪÏÂÃæ½á¹¹ÌåµÄÖ¸Õ룺

struct sockaddr {

    unsigned short sa_family;

    char           sa_data[14];

};

ÆäÖУ¬sa_familyΪµØÖ·×壬ÔÚMicrosoftµÄTCP/IP socket¿ª·¢°üÖÐÖ»Ö§³ÖIternetµÄµØÖ·Óò£¨×壩£¬¼´Ö»ÄÜʹÓÃAF_INET£¨»òÕßPF_INET£©.

sa_dataΪipµØÖ·ºÍ¶Ë¿ÚµÈÐÅÏ¢¡£14ΪËù²»Í¬格ʽµÄipµØÖ·ºÍ¶Ë¿ÚºÅµÄ×î´ó值¡£

ÔÚʹÓÃʱΪÁË·½±ã¿ÉÒÔʹÓÃSOCKADDR_IN½á¹¹ÀàÐ͵ÄÇ¿ÖÆÀàÐÍת»»Ö¸ÕëÀ´´úÌæSOCKADDRÀàÐ͵ÄÖ¸Õë¡£ÓÉÓÚÁ½ÕߵĴóСһÑù£¬ËùÒÔÖ¸Ïòsockaddr_in µÄÖ¸ÕëºÍÖ¸ÏòsockaddrµÄÖ¸Õë¿ÉÒÔÖ±½Ó½øÐÐÇ¿ÖÆÀàÐÍת»»¡£ÕâÒâζ×ÅÈç¹ûÒ»¸öº¯ÊýËùÐè²ÎÊýÀàÐÍÊÇsockaddrʱ£¬Äã¿ÉÒÔÔÚº¯Êýµ÷ÓõÄʱºò½«Ò»¸öÖ¸Ïò sockaddr_inµÄÖ¸Õëת»»ÎªÖ¸ÏòsockaddrµÄÖ¸Õ룻»òÕßÏà·´¡£SOCKADDR_IN½á¹¹ÈçÏ£º

struct sockaddr_in {

    short            sin_family;

    unsigned short      sin_port;

    struct   in_addr      sin_addr;

    char               sin_zero[8];

};

ÆäÖУ¬sin_familyºÍsa_familyÏàͬ£¬sin_portÊÇsocketµÄ¶Ë¿ÚºÅ£¬ÔÚ¸³值ʱÐèҪʹÓÃhtons½øÐдӻúÆ÷×Ö½Ú˳Ðòµ½ÍøÂç×Ö½Ú˳ÐòµÄת»»¡£

ÆäËûµÄת»»º¯ÊýÈçÏ£º

htons()£º"Host to Network Short";

htonl()  "Host to Network Long";

ntohs()  "Network to Host Short";

ntohl()  "Network to Host Long"

ÔÚÕâÀ h±íʾ"host" £¬n±íʾ"network"£¬s ±íʾ"short"£¬l±íʾ "long"

sin_addrΪIPµØÖ·£¬ÀàÐͽṹÈçÏ£º

struct   in_addr {

    union {

         struct {

             unsigned  char s_b1,

                            s_b2,

                            s_b3,

                            s_b4;

         } S_un_b;

         struct {

             unsigned  short  s_w1,

                              s_w2;

         } S_un_w;

         unsigned long  S_addr;

     } S_un;

};

Èç¹ûÒª±íʾipΪ192.168.0.225µÄµØÖ·£¬¸³值ʱ¿ÉÒÔÈçÏ£º

sin_addr.S_un.S_addr=((192*256+168)*256+0)*256+225£¨ÐèҪת»»³ÉÍøÂç×Ö½ÚÐò£©¡£»òÕß

sin_addr.s_addr = htonl(INADDR_ANY)//ÔÚsocket2.hÀïÓÐ#define s_addr Sun.S_addr

//ÕâÀïʹÓÃINADDR_ANY±íʾ±¾»úµØÖ·¡£ÆäËûµÄ·½·¨Ö»Òª·ûºÏ½á¹¹µÄ¹æÔò¶¼¿ÉÒÔÓá£

unsigned char sin_zero[8]; ÊÇΪÁ˱£³ÖÓëstruct sockaddrͬÑù´óС£¬Ò»°ãÌî³ä0 

ÔÚ´´½¨½á¹¹Ìå¶ÔÏóʱ¿ÉÒÔÓ¦¸ÃÓÃbzero()»òmemset()º¯Êý½«½á¹¹Ìå¶ÔÏóÖÿա£

ÓйØAF_INETµÄ˵Ã÷£º

AF_INETµØÖ·ÏµÁÐÌ×½Ó×Ö¿ÉÒÔÊÇÃæÏòÁ¬½ÓµÄ£¨ÀàÐÍ SOCK_STREAM£©£¬Ò²¿ÉÒÔÊÇÎÞÁ¬½ÓµÄ£¨ÀàÐÍ SOCK_DGRAM£©¡£ÃæÏòÁ¬½ÓµÄ AF_INET Ì×½Ó×Ö½« TCP ÓÃ×÷´«ÊäЭÒé¡£ÎÞÁ¬½ÓµÄ AF_INET Ì×½Ó×Ö½« UDP ÓÃ×÷´«ÊäЭÒé¡£ÔÚ´´½¨ AF_INET ÓòÌ×½Ó×Öʱ£¬Ö¸¶¨ AF_INET ×÷ΪÌ×½Ó×Ö³ÌÐòÖеĵØÖ·ÏµÁС£AF_INET Ì×½Ó×Ö»¹¿ÉÒÔʹÓÃÀàÐÍ SOCK_RAW¡£Èç¹ûÉèÖÃÁË´ËÀàÐÍ£¬Ó¦ÓóÌÐò»áÖ±½ÓÁ¬½ÓÖÁ IP ²ã£¬¶ø²»Ê¹ÓàTCP »ò UDP ´«Êä¡£Óйؽ«»·¾³ÉèÖÃΪʹÓàAF_INET µØÖ·ÏµÁеÄÏêϸÐÅÏ¢£¬²Î¼ûÌ×½Ó×Ö±à³ÌµÄÏȾöÌõ¼þ¡£ ÓйØÊ¹ÓàAF_INET µØÖ·ÏµÁеÄÑù±¾³ÌÐò£¬²Î¼ûʾÀý£ºÃæÏòÁ¬½ÓµÄ·þÎñÆ÷ºÍʾÀý£ºÃæÏòÁ¬½ÓµÄ¿Í»§»ú¡£

ÈȵãÅÅÐÐ