¶ÁÊéÈË

UNIXѧϰ֮· Ò»²½Ò»¸ö½ÅÓ¡¶ùÖ®socket

·¢²¼Ê±¼ä£º 2013-04-07 12:50:11 ×÷Õߣº rapoo

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

¶ÁÊéÈËÍø >±à³Ì

ÈȵãÍÆ¼ö