Linux C±à³Ì---ÍøÂç±à³Ì

×÷Õß: cooc 2005-06-03 00:03:18
ÍøÂç±à³Ì£¬Ò»¶¨Àë²»¿ªÌ×½Ó¿Ú£»ÄÇʲôÊÇÌ×½Ó¿ÚÄØ£¿ÔÚLinuxÏ£¬ËùÓеÄI/O²Ù×÷¶¼ÊÇͨ¹ý¶ÁдÎļþÃèÊö·û¶ø²úÉúµÄ£¬ÎļþÃèÊö·ûÊÇÒ»¸öºÍ´ò¿ªµÄÎļþÏà¹ØÁªµÄÕûÊý£¬Õâ¸öÎļþ²¢²»Ö»°üÀ¨ÕæÕý´æ´¢ÔÚ´ÅÅÌÉϵÄÎļþ£¬»¹°üÀ¨Ò»¸öÍøÂçÁ¬½Ó¡¢Ò»¸öÃüÃû¹ÜµÀ¡¢Ò»¸öÖն˵ȣ¬¶øÌ×½Ó¿Ú¾ÍÊÇϵͳ½ø³ÌºÍÎļþÃèÊö·ûͨÐŵÄÒ»ÖÖ·½·¨¡£Ä¿Ç°×î³£ÓõÄÌ×½Ó¿ÚÊÇ×Ö£º×Ö½ÚÁ÷Ì×½Ó¿Ú(»ùÓÚTCP)ºÍÊý¾Ý±¨Ì×½Ó¿Ú(»ùÓÚUDP)£¬µ±È»»¹ÓÐԭʼÌ×½Ó¿Ú(ԭʼÌ×½Ó¿ÚÌṩTCPÌ×½Ó¿ÚºÍUDPÌ×½Ó¿ÚËù²»ÌṩµÄ¹¦ÄÜ£¬Èç¹¹Ôì×Ô¼ºµÄTCP»òUDP·Ö×é)µÈ£¬ÎÒÃÇÕâÀïÖ÷Òª½éÉÜ×Ö½ÚÁ÷Ì×½Ó¿ÚºÍÊý¾Ý±¨Ì×½Ó¿Ú¡£

ҪѧϰÍøÂç±à³Ì£¬Ò»¶¨Àë²»¿ªÍøÂç¿âµÄº¯Êý£¬ÔÚLinuxϵͳÏ£¬¿ÉÒÔÓÃ"man º¯ÊýÃû"À´µÃµ½Õâ¸öº¯ÊýµÄ°ïÖú£¬²»¹ýΪÁËÕÕ¹ËEÎIJ»´óºÃµÄÅóÓÑ£¬ÏÂÃæ¾Í½«³£ÓõÄÍøÂ纯ÊýºÍÓ÷¨ÁгöÀ´¹©´ó¼Ò²Î¿¼£º

£±¡¢socketº¯Êý£ºÎªÁËÖ´ÐÐÍøÂçÊäÈëÊä³ö£¬Ò»¸ö½ø³Ì±ØÐë×öµÄµÚÒ»¼þʾÍÊǵ÷ÓÃsocketº¯Êý»ñµÃÒ»¸öÎļþÃèÊö·û¡£
-------------------------------------------------------------------------------------
#include ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡
int socket(int family,int type,int protocol); ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡·µ»Ø£º·Ç¸ºÃèÊö×Ö£­£­£­³É¹¦¡¡¡¡¡¡-1£­£­£­Ê§°Ü
-------------------------------------------------------------------------------------
µÚÒ»¸ö²ÎÊýÖ¸Ã÷ÁËЭÒé´Ø£¬Ä¿Ç°Ö§³Ö5ÖÖЭÒé´Ø£¬×î³£ÓõÄÓÐAF_INET(IPv4ЭÒé)ºÍAF_INET6(IPv6ЭÒé)£»µÚ¶þ¸ö²ÎÊýÖ¸Ã÷Ì×½Ó¿ÚÀàÐÍ£¬ÓÐÈýÖÖÀàÐÍ¿ÉÑ¡£ºSOCK_STREAM(×Ö½ÚÁ÷Ì×½Ó¿Ú)¡¢SOCK_DGRAM(Êý¾Ý±¨Ì×½Ó¿Ú)ºÍSOCK_RAW(ԭʼÌ×½Ó¿Ú)£»Èç¹ûÌ×½Ó¿ÚÀàÐͲ»ÊÇԭʼÌ×½Ó¿Ú£¬ÄÇôµÚÈý¸ö²ÎÊý¾ÍΪ0¡£

£²¡¢connectº¯Êý£ºµ±ÓÃsocket½¨Á¢ÁËÌ׽ӿں󣬿ÉÒÔµ÷ÓÃconnectΪÕâ¸öÌ×½Ó×ÖÖ¸Ã÷Ô¶³Ì¶ËµÄµØÖ·£»Èç¹ûÊÇ×Ö½ÚÁ÷Ì×½Ó¿Ú£¬connect¾ÍʹÓÃÈý´ÎÎÕÊÖ½¨Á¢Ò»¸öÁ¬½Ó£»Èç¹ûÊÇÊý¾Ý±¨Ì×½Ó¿Ú£¬connect½öÖ¸Ã÷Ô¶³Ì¶ËµØÖ·£¬¶ø²»ÏòËü·¢ËÍÈκÎÊý¾Ý¡£
-------------------------------------------------------------------------------------
#include ¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡
int connect(int sockfd,const struct sockaddr * servaddr,socklen_t addrlen); ¡¡
¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡¡¡·µ»Ø£º0£­£­£­³É¹¦¡¡¡¡¡¡-1£­£­£­Ê§°Ü
-------------------------------------------------------------------------------------
µÚÒ»¸ö²ÎÊýÊÇsocketº¯Êý·µ»ØµÄÌ×½Ó¿ÚÃèÊö×Ö£»µÚ¶þºÍµÚÈý¸ö²ÎÊý·Ö±ðÊÇÒ»¸öÖ¸ÏòÌ×½Ó¿ÚµØÖ·½á¹¹µÄÖ¸ÕëºÍ¸Ã½á¹¹µÄ´óС¡£
ÕâЩµØÖ·½á¹¹µÄÃû×Ö¾ùÒÑ¡°sockaddr_¡±¿ªÍ·£¬²¢ÒÔ¶ÔӦÿ¸öЭÒé×åµÄΨһºó׺½áÊø¡£ÒÔIPv4Ì×½Ó¿ÚµØÖ·½á¹¹ÎªÀý£¬ËüÒÔ¡°sockaddr_in¡±ÃüÃû£¬¶¨ÒåÔÚÍ·Îļþ£»ÒÔÏÂÊǽṹÌåµÄÄÚÈÝ£º
-------------------------------------------------------------------------------------
struct in_addr {
in_addr_t s_addr;¡¡ ¡¡ ¡¡ /* IPv4µØÖ· */
};¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡ ¡¡¡¡¡¡ ¡¡
struct sockaddr_in {
uint8_t sin_len; /* ÎÞ·ûºÅµÄ8λÕûÊý */
sa_family_t sin_family; /* Ì×½Ó¿ÚµØÖ·½á¹¹µÄµØÖ·´Ø£¬ÕâÀïΪAF_INET */
in_port_t sin_port; /* TCP»òUDP¶Ë¿Ú */
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡
struct in_addr sin_addr;
char sin_zero[8];
};¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡
-------------------------------------------------------------------------------------

£³¡¢bindº¯Êý£ºÎªÌ×½Ó¿Ú·ÖÅäÒ»¸ö±¾µØIPºÍЭÒé¶Ë¿Ú£¬¶ÔÓÚÍø¼ÊЭÒ飬ЭÒéµØÖ·ÊÇ32λIPv4µØÖ·»ò128λIPv6µØÖ·Óë16λµÄTCP»òUDP¶Ë¿ÚºÅµÄ×éºÏ£»ÈçÖ¸¶¨¶Ë¿ÚΪ0£¬µ÷ÓÃbindʱÄں˽«Ñ¡ÔñÒ»¸öÁÙʱ¶Ë¿Ú£¬Èç¹ûÖ¸¶¨Ò»¸öͨÅäIPµØÖ·£¬ÔòÒªµÈµ½½¨Á¢Á¬½ÓºóÄں˲ÅÑ¡ÔñÒ»¸ö±¾µØIPµØÖ·¡£
-------------------------------------------------------------------------------------
#include ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
int bind(int sockfd,const struct sockaddr * myaddr,socklen_t addrlen);
·µ»Ø£º0£­£­£­³É¹¦¡¡¡¡¡¡-1£­£­£­Ê§°Ü¡¡
-------------------------------------------------------------------------------------
µÚÒ»¸ö²ÎÊýÊÇsocketº¯Êý·µ»ØµÄÌ×½Ó¿ÚÃèÊö×Ö£»µÚ¶þºÍµÚµÚÈý¸ö²ÎÊý·Ö±ðÊÇÒ»¸öÖ¸ÏòÌض¨ÓÚЭÒéµÄµØÖ·½á¹¹µÄÖ¸ÕëºÍ¸ÃµØÖ·½á¹¹µÄ³¤¶È¡£

£´¡¢listenº¯Êý£ºlistenº¯Êý½ö±»TCP·þÎñÆ÷µ÷Óã¬ËüµÄ×÷ÓÃÊǽ«ÓÃsock´´½¨µÄÖ÷¶¯Ì×½Ó¿Úת»»³É±»¶¯Ì×½Ó¿Ú£¬²¢µÈ´ýÀ´×Ô¿Í»§¶ËµÄÁ¬½ÓÇëÇó¡£
-------------------------------------------------------------------------------------
#include ¡¡¡¡¡¡¡¡¡¡¡¡
int listen(int sockfd,int backlog); ¡¡¡¡
·µ»Ø£º0£­£­£­³É¹¦¡¡¡¡¡¡-1£­£­£­Ê§°Ü
-------------------------------------------------------------------------------------
¡¡¡¡µÚÒ»¸ö²ÎÊýÊÇsocketº¯Êý·µ»ØµÄÌ×½Ó¿ÚÃèÊö×Ö£»µÚ¶þ¸ö²ÎÊý¹æ¶¨ÁËÄÚºËΪ´ËÌ×½Ó¿ÚÅŶӵÄ×î´óÁ¬½Ó¸öÊý¡£ÓÉÓÚlistenº¯ÊýµÚ¶þ¸ö²ÎÊýµÄÔ­Òò£¬ÄÚºËҪά»¤Á½¸ö¶ÓÁУºÒÔÍê³ÉÁ¬½Ó¶ÓÁкÍδÍê³ÉÁ¬½Ó¶ÓÁС£Î´Íê³É¶ÓÁÐÖдæ·ÅµÄÊÇTCPÁ¬½ÓµÄÈý·ÎÕÊÖΪÍê³ÉµÄÁ¬½Ó£¬acceptº¯ÊýÊÇ´ÓÒÔÁ¬½Ó¶ÓÁÐÖÐÈ¡Á¬½Ó·µ»Ø¸ø½ø³Ì£»µ±ÒÔÁ¬½Ó¶ÓÁÐΪ¿Õʱ£¬½ø³Ì½«½øÈë˯Ãß״̬¡£

£µ¡¢acceptº¯Êý£ºacceptº¯ÊýÓÉTCP·þÎñÆ÷µ÷Ó㬴ÓÒÑÍê³ÉÁ¬½Ó¶ÓÁÐÍ··µ»ØÒ»¸öÒÑÍê³ÉÁ¬½Ó£¬Èç¹ûÍê³ÉÁ¬½Ó¶ÓÁÐΪ¿Õ£¬Ôò½ø³Ì½øÈë˯Ãß״̬¡£
-------------------------------------------------------------------------------------
#include ¡¡¡¡ ¡¡ ¡¡ ¡¡
int accept(int sockfd,struct sockaddr * cliaddr,socklen_t * addrlen);¡¡¡¡¡¡¡¡ ¡¡
¡¡¡¡ ·µ»Ø£º·Ç¸ºÃèÊö×Ö£­£­£­³É¹¦¡¡¡¡¡¡-1£­£­£­Ê§°Ü
-------------------------------------------------------------------------------------
µÚÒ»¸ö²ÎÊýÊÇsocketº¯Êý·µ»ØµÄÌ×½Ó¿ÚÃèÊö×Ö£»µÚ¶þ¸öºÍµÚÈý¸ö²ÎÊý·Ö±ðÊÇÒ»¸öÖ¸ÏòÁ¬½Ó·½µÄÌ×½Ó¿ÚµØÖ·½á¹¹ºÍ¸ÃµØÖ·½á¹¹µÄ³¤¶È£»¸Ãº¯Êý·µ»ØµÄÊÇÒ»¸öȫеÄÌ×½Ó¿ÚÃèÊö×Ö£»Èç¹û¶Ô¿Í»§¶ÎµÄÐÅÏ¢²»¸ÐÐËȤ£¬¿ÉÒÔ½«µÚ¶þºÍµÚÈý¸ö²ÎÊýÖÃΪ¿Õ¡£

£¶¡¢inet_ptonº¯Êý£º½«µã·ÖÊ®½øÖÆ´®×ª»»³ÉÍøÂç×Ö½ÚÐò¶þ½øÖÆÖµ£¬´Ëº¯Êý¶ÔIPv4µØÖ·ºÍIPv6µØÖ·¶¼ÄÜ´¦Àí¡£
-------------------------------------------------------------------------------------
¡¡#include ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
int inet_pton(int family,const char * strptr,void * addrptr);¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡
·µ»Ø£º1£­£­£­³É¹¦¡¡¡¡¡¡0£­£­£­ÊäÈë²»ÊÇÓÐЧµÄ±í´ï¸ñʽ¡¡¡¡¡¡-1£­£­£­Ê§°Ü
-------------------------------------------------------------------------------------
µÚÒ»¸ö²ÎÊý¿ÉÒÔÊÇAF_INET»òAF_INET6£ºµÚ¶þ¸ö²ÎÊýÊÇÒ»¸öÖ¸Ïòµã·ÖÊ®½øÖÆ´®µÄÖ¸Õ룺µÚÈý¸ö²ÎÊýÊÇÒ»¸öÖ¸Ïòת»»ºóµÄÍøÂç×Ö½ÚÐòµÄ¶þ½øÖÆÖµµÄÖ¸Õë¡£

£·¡¢inet_ntopº¯Êý£ººÍinet_ptonº¯ÊýÕýºÃÏà·´£¬inet_ntopº¯ÊýÊǽ«ÍøÂç×Ö½ÚÐò¶þ½øÖÆֵת»»³Éµã·ÖÊ®½øÖÆ´®¡£
-------------------------------------------------------------------------------------
#include ¡¡
const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len); ¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ·µ»Ø£ºÖ¸Ïò½á¹ûµÄÖ¸Õ룭£­£­³É¹¦¡¡¡¡¡¡NULL£­£­£­Ê§°Ü
-------------------------------------------------------------------------------------
µÚÒ»¸ö²ÎÊý¿ÉÒÔÊÇAF_INET»òAF_INET6£ºµÚ¶þ¸ö²ÎÊýÊÇÒ»¸öÖ¸ÏòÍøÂç×Ö½ÚÐòµÄ¶þ½øÖÆÖµµÄÖ¸Õ룻µÚÈý¸ö²ÎÊýÊÇÒ»¸öÖ¸Ïòת»»ºóµÄµã·ÖÊ®½øÖÆ´®µÄÖ¸Õ룻µÚËĸö²ÎÊýÊÇÄ¿±êµÄ´óС£¬ÒÔÃ⺯ÊýÒç³öÆäµ÷ÓÃÕߵĻº³åÇø¡£

£¸¡¢fockº¯Êý£ºÔÚÍøÂç·þÎñÆ÷ÖУ¬Ò»¸ö·þÎñ¶Ë¿Ú¿ÉÒÔÔÊÐíÒ»¶¨ÊýÁ¿µÄ¿Í»§¶ËͬʱÁ¬½Ó£¬Õâʱµ¥½ø³ÌÊDz»¿ÉÄÜʵÏֵģ¬¶øfock¾Í·ÖÅäÒ»¸ö×Ó½ø³ÌºÍ¿Í»§¶Ë»á»°£¬µ±È»£¬ÕâÖ»ÊÇfockµÄÒ»¸öµäÐÍÓ¦Óá£
-------------------------------------------------------------------------------------
#include ¡¡
pid_t fock(void);¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡ ¡¡ ·µ»Ø£ºÔÚ×Ó½ø³ÌÖÐΪ0£¬ÔÚ¸¸½ø³ÌÖÐΪ×Ó½ø³ÌID¡¡¡¡¡¡-1£­£­£­Ê§°Ü
-------------------------------------------------------------------------------------
fockº¯Êýµ÷Óú󷵻ØÁ½´Î£¬¸¸½ø³Ì·µ»Ø×Ó½ø³ÌID£¬×Ó½ø³Ì·µ»Ø0¡£

ÓÐÁËÉÏÃæµÄ»ù´¡ÖªÊ¶£¬ÎÒÃǾͿÉÒÔ½øÒ»²½Á˽âTCPÌ×½Ó¿ÚºÍUDPÌ×½Ó¿Ú
£±¡¢TCPÌ×½Ó¿Ú
¡¡¡¡TCPÌ×½Ó¿ÚʹÓÃTCP½¨Á¢Á¬½Ó£¬½¨Á¢Ò»¸öTCPÁ¬½ÓÐèÒªÈý´ÎÎÕÊÖ£¬»ù±¾¹ý³ÌÊÇ·þÎñÆ÷ÏȽ¨Á¢Ò»¸öÌ×½Ó¿Ú²¢µÈ´ý¿Í»§¶ËµÄÁ¬½ÓÇëÇó£»µ±¿Í»§¶Ëµ÷ÓÃconnect½øÐÐÖ÷¶¯Á¬½ÓÇëÇóʱ£¬¿Í»§¶ËTCP·¢ËÍÒ»¸öSYN£¬¸æËß·þÎñÆ÷¿Í»§¶Ë½«ÔÚÁ¬½ÓÖз¢Ë͵ÄÊý¾ÝµÄ³õʼÐòÁкţ»µ±·þÎñÆ÷ÊÕµ½Õâ¸öSYNºóÒ²¸ø¿Í»§¶Ë·¢Ò»¸öSYN£¬ÀïÃæ°üº¬ÁË·þÎñÆ÷½«ÔÚͬһÁ¬½ÓÖз¢Ë͵ÄÊý¾ÝµÄ³õʼÐòÁкţ»×îºó¿Í»§ÔÚÈ·ÈÏ·þÎñÆ÷·¢µÄSYN¡£µ½´ËΪֹ£¬Ò»¸öTCPÁ¬½Ó±»½¨Á¢¡£
¡¡¡¡ÏÂÃæ¾ÍÓÃÒ»¸öÀý×ÓÀ´ËµÃ÷·þÎñÆ÷ºÍ¿Í»§ÊÇÔõôÁ¬½ÓµÄ
-------------------------------------------------------------------------------------
/* client.c */
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include

¡¡¡¡¡¡¡¡int main(int argc,char *argv[]) {
¡¡¡¡¡¡¡¡ int sockfd,numbytes;
¡¡¡¡¡¡¡¡ char buf[100];
¡¡¡¡¡¡¡¡ struct hostent *he;
¡¡¡¡¡¡¡¡ struct sockaddr_in their_addr;

¡¡¡¡¡¡¡¡ int i = 0;
¡¡¡¡¡¡¡¡¡¡//½«»ù±¾Ãû×ֺ͵Øַת»»
¡¡¡¡¡¡¡¡ he = gethostbyname(argv[1]);

¡¡¡¡¡¡¡¡¡¡//½¨Á¢Ò»¸öTCPÌ×½Ó¿Ú
¡¡¡¡¡¡¡¡ if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) {
¡¡¡¡¡¡¡¡ perror("socket");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡¡¡ ¡¡}

//³õʼ»¯½á¹¹Ì壬Á¬½Óµ½·þÎñÆ÷µÄ2323¶Ë¿Ú
¡¡¡¡¡¡¡¡ their_addr.sin_family = AF_INET;
¡¡¡¡¡¡¡¡ their_addr.sin_port = htons(2323);
¡¡¡¡¡¡¡¡ their_addr.sin_addr = *((struct in_addr *)he->h_addr);
¡¡¡¡¡¡¡¡ bzero(&(their_addr.sin_zero),8);

¡¡¡¡¡¡¡¡¡¡//ºÍ·þÎñÆ÷½¨Á¢Á¬½Ó
¡¡¡¡¡¡¡¡ if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1) {
¡¡¡¡¡¡¡¡ perror("connect");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡ ¡¡¡¡}

//Ïò·þÎñÆ÷·¢ËÍ×Ö·û´®"hello!"
¡¡¡¡¡¡¡¡ if(send(sockfd,"hello!",6,0)==-1) {
¡¡¡¡¡¡ ¡¡perror("send");
¡¡¡¡¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡¡¡¡¡ }

//½ÓÊÜ´Ó·þÎñÆ÷·µ»ØµÄÐÅÏ¢
¡¡¡¡¡¡¡¡ if((numbytes = recv(sockfd,buf,100,0))==-1) {
¡¡ ¡¡¡¡¡¡perror("recv");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡¡¡¡¡ }

¡¡¡¡¡¡¡¡ buf[numbytes] = \;
¡¡¡¡¡¡¡¡ printf("result:%s",buf);

¡¡¡¡¡¡¡¡ close(sockfd);
¡¡¡¡¡¡ return 0;
¡¡ ¡¡¡¡}
-------------------------------------------------------------------------------------
/* server.c */
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include
¡¡¡¡¡¡¡¡#include

¡¡¡¡¡¡¡¡main() {
¡¡¡¡¡¡¡¡ int sockfd,new_fd;
¡¡¡¡¡¡¡¡ struct sockaddr_in my_addr;
¡¡¡¡¡¡¡¡ struct sockaddr_in their_addr;
¡¡¡¡¡¡¡¡ int sin_size;

¡¡¡¡¡¡¡¡¡¡//½¨Á¢TCPÌ×½Ó¿Ú
¡¡¡¡¡¡¡¡ if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) {
¡¡¡¡¡¡¡¡ perror("socket");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡¡¡¡¡ }

¡¡¡¡¡¡¡¡¡¡//³õʼ»¯½á¹¹Ì壬²¢°ó¶¨2323¶Ë¿Ú
¡¡¡¡¡¡¡¡ my_addr.sin_family = AF_INET;
¡¡¡¡¡¡¡¡ my_addr.sin_port = htons(2323);
¡¡¡¡¡¡¡¡ my_addr.sin_addr.s_addr = INADDR_ANY;
¡¡¡¡¡¡¡¡ bzero(&(my_addr.sin_zero),8);

//°ó¶¨Ì×½Ó¿Ú
¡¡¡¡¡¡¡¡ if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1) {
¡¡¡¡¡¡¡¡ perror("bind");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡¡¡¡¡ }

¡¡¡¡¡¡¡¡¡¡//´´½¨¼àÌýÌ×½Ó¿Ú
¡¡¡¡¡¡¡¡ if(listen(sockfd,10)==-1) {
¡¡¡¡¡¡¡¡ perror("listen");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡¡¡¡¡ }

//µÈ´ýÁ¬½Ó
¡¡¡¡¡¡¡¡ while(1) {
¡¡¡¡¡¡¡¡ sin_size = sizeof(struct sockaddr_in);
¡¡¡¡¡¡¡¡ perror("server is run");

¡¡¡¡¡¡¡¡¡¡¡¡//Èç¹û½¨Á¢Á¬½Ó£¬½«²úÉúÒ»¸öȫеÄÌ×½Ó×Ö
¡¡¡¡¡¡¡¡ if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1) {
¡¡¡¡¡¡¡¡ perror("accept");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡¡¡¡¡ }

¡¡¡¡¡¡¡¡¡¡¡¡//Éú³ÉÒ»¸ö×Ó½ø³ÌÀ´Íê³ÉºÍ¿Í»§¶ËµÄ»á»°£¬¸¸½ø³Ì¼ÌÐø¼àÌý
¡¡¡¡¡¡¡¡ if(!fork()) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡//¶ÁÈ¡¿Í»§¶Ë·¢À´µÄÐÅÏ¢
¡¡¡¡¡¡¡¡ if((numbytes = recv(new_fd,buff,strlen(buff),0))==-1) {
¡¡¡¡¡¡ ¡¡ perror("recv");
¡¡¡¡¡¡¡¡ exit(1);
¡¡¡¡¡¡¡¡ }

¡¡¡¡¡¡¡¡ printf("%s",buff);

¡¡¡¡¡¡¡¡¡¡¡¡¡¡//½«´Ó¿Í»§¶Ë½ÓÊÕµ½µÄÐÅÏ¢ÔÙ·¢»Ø¿Í»§¶Ë
¡¡¡¡¡¡¡¡ if(send(new_fd,buff,strlen(buff),0)==-1)
¡¡¡¡¡¡¡¡perror("send");

¡¡¡¡¡¡¡¡ close(new_fd);
¡¡¡¡¡¡¡¡ exit(0);
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡ close(new_fd);
¡¡¡¡¡¡¡¡ }
¡¡¡¡¡¡¡¡ close(sockfd);
¡¡¡¡¡¡¡¡}
-------------------------------------------------------------------------------------
ÏÖÔÚÈÃÎÒÃÇÀ´±àÒëÕâÁ½¸ö³ÌÐò£º
root@linuxaid#gcc -o server server.c
root@linuxaid#gcc -o client client.c
È»ºóÔÚһ̨¼ÆËã»úÉÏÏÈÔËÐзþÎñÆ÷³ÌÐò£¬ÔÙÔÚÁíÒ»¸öÖÕ¶ËÉÏÔËÐпͻ§¶Ë¾Í»á¿´µ½½á¹û£»Èç¹û²»ÔËÐзþÎñÆ÷³ÌÐò¶øÏÈÔËÐпͻ§³ÌÐò½«Á¢¼´Ìáʾ"Connect: Connection refused"£¬Õâ¾ÍÊÇTCPÌ׽ӿڵĺô¦£¬Èç¹ûÊÇUDPÌ×½Ó¿Ú½«»áÓÐÒ»¸öÑÓʱ²Å»áµÃµ½´íÎóÐÅÏ¢(UDPÌ×½Ó¿ÚºóÃæÓнéÉÜ)¡£
-------------------------------------------------------------------------------------
¡¡¡¡½¨Á¢Ò»¸öTCPÁ¬½ÓÐèÒªÈý´ÎÎÕÊÖ£¬¶ø¶Ï¿ªÒ»¸öTCPÔòÐèÒªËĸö·Ö½Ú¡£µ±Ä³¸öÓ¦Óýø³Ìµ÷ÓÃclose(Ö÷¶¯¶Ë)ºó(¿ÉÒÔÊÇ·þÎñÆ÷¶Ë£¬Ò²¿ÉÒÔÊÇ¿Í»§¶Ë)£¬ÕâÒ»¶ËµÄTCP·¢ËÍÒ»¸öFIN£¬±íʾÊý¾Ý·¢ËÍÍê±Ï£»ÁíÒ»¶Ë(±»¶¯¶Ë)·¢ËÍÒ»¸öÈ·ÈÏ£¬µ±±»¶¯¶Ë´ý´¦ÀíµÄÓ¦Óýø³Ì¶¼´¦ÀíÍê±Ïºó£¬·¢ËÍÒ»¸öFINµ½Ö÷¶¯¶Ë£¬²¢¹Ø±ÕÌ×½Ó¿Ú£¬Ö÷¶¯¶Ë½ÓÊÕµ½Õâ¸öFINºóÔÙ·¢ËÍÒ»¸öÈ·ÈÏ£¬µ½´ËΪֹÕâ¸öTCPÁ¬½Ó±»¶Ï¿ª¡£

£²¡¢UDPÌ×½Ó¿Ú
¡¡¡¡UDPÌ×½Ó¿ÚÊÇÎÞÁ¬½ÓµÄ¡¢²»¿É¿¿µÄÊý¾Ý±¨Ð­Ò飻¼ÈÈ»Ëû²»¿É¿¿ÎªÊ²Ã´»¹ÒªÓÃÄØ£¿ÆäÒ»£ºµ±Ó¦ÓóÌÐòʹÓù㲥»ò¶à²¥ÊÇÖ»ÄÜʹÓÃUDPЭÒ飻Æä¶þ£ºÓÉÓÚËûÊÇÎÞÁ¬½ÓµÄ£¬ËùÒÔËٶȿ졣ÒòΪUDPÌ×½Ó¿ÚÊÇÎÞÁ¬½ÓµÄ£¬Èç¹ûÒ»·½µÄÊý¾Ý±¨¶ªÊ§£¬ÄÇÁíÒ»·½½«ÎÞÏ޵ȴý£¬½â¾ö°ì·¨ÊÇÉèÖÃÒ»¸ö³¬Ê±¡£
¡¡¡¡ÔÚ±àдUDPÌ×½Ó¿Ú³ÌÐòʱ£¬Óм¸µãҪעÒ⣺½¨Á¢Ì×½Ó¿Úʱsocketº¯ÊýµÄµÚ¶þ¸ö²ÎÊýÓ¦¸ÃÊÇSOCK_DGRAM£¬ËµÃ÷Êǽ¨Á¢Ò»¸öUDPÌ×½Ó¿Ú£»ÓÉÓÚUDPÊÇÎÞÁ¬½ÓµÄ£¬ËùÒÔ·þÎñÆ÷¶Ë²¢²»ÐèÒªlisten»òacceptº¯Êý£»µ±UDPÌ×½Ó¿Úµ÷ÓÃconnectº¯Êýʱ£¬ÄÚºËÖ»¼Ç¼Á¬½Ó·ÅµÄIPµØÖ·ºÍ¶Ë¿Ú£¬²¢Á¢¼´·µ»Ø¸øµ÷Óýø³Ì£¬ÕýÒòΪÕâ¸öÌØÐÔ£¬UDP·þÎñÆ÷³ÌÐòÖв¢²»Ê¹ÓÃfockº¯Êý£¬Óõ¥½ø³Ì¾ÍÄÜÍê³ÉËùÓпͻ§µÄÇëÇó¡£

Ïà¹Ø×ÊѶ