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 µØÖ·ÏµÁеÄÑù±¾³ÌÐò£¬²Î¼ûʾÀý£ºÃæÏòÁ¬½ÓµÄ·þÎñÆ÷ºÍʾÀý£ºÃæÏòÁ¬½ÓµÄ¿Í»§»ú¡£