ºìÁªLinuxÃÅ»§
Linux°ïÖú

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

·¢²¼Ê±¼ä:2005-06-03 00:03:18À´Ô´:ºìÁª×÷Õß:cooc
ÍøÂç±à³Ì£¬Ò»¶¨Àë²»¿ªÌ×½Ó¿Ú£»ÄÇʲôÊÇÌ×½Ó¿ÚÄØ£¿ÔÚ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º¯Êý£¬Óõ¥½ø³Ì¾ÍÄÜÍê³ÉËùÓпͻ§µÄÇëÇó¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 39 ÌõÆÀÂÛ

  1. geekf ÓÚ 2015-11-17 15:47:31·¢±í:

    :0)1

  2. luguanhuang ÓÚ 2011-02-23 22:47:38·¢±í:

    ºÃ¶«Î÷

  3. xuzilong100200 ÓÚ 2011-02-20 15:56:59·¢±í:

    ллŶ

  4. wzmlxl ÓÚ 2011-02-15 20:55:11·¢±í:

    Ö§³Öһϣ¬Ñ§Ï°ÁË(o):tx°¢ÈøµÂ·¨Ê¦µÄ·¨¶¨·Ö

  5. wzmlxl ÓÚ 2011-02-15 20:55:07·¢±í:

    Ö§³Öһϣ¬Ñ§Ï°ÁË(o):tx

  6. Ëæ±ã521241 ÓÚ 2011-02-14 17:53:18·¢±í:

    ºÃ

  7. qxhong ÓÚ 2011-01-30 09:51:30·¢±í:

    ²»ÖªÈçºÎ£¬ÏÈ¿´¿´

  8. luguanhuang ÓÚ 2011-01-15 17:34:01·¢±í:

    ºÃ¶«Î÷ ллÁË

  9. yyxl ÓÚ 2010-12-08 15:46:17·¢±í:

    Èç¹ûÎÒ²»¿ª·¢¿Í»§¶Ë³ÌÐò¡£¶øÊÇͨ¹ýä¯ÀÀÆ÷·ÃÎÊ·þÎñÆ÷µÄÒѾ­´ò¿ªµÄ¶Ë¿Ú£¬ÈçºÎ°ÑÏëÊä³öµÄÄÚÈÝÊä³öµ½ä¯ÀÀÆ÷¡£Ò²¾ÍÊÇÓÃcÓïÑÔʵÏÖhttp·þÎñÆ÷¡£

  10. ruthless369 ÓÚ 2010-11-30 16:55:31·¢±í:

    Ö§³Ö£¡
    Ö§³Ö£¡

  11. 742597408 ÓÚ 2010-11-29 14:43:34·¢±í:

    ºÃ£¬¸ßÊÖ¾ÍÊǸßÊÖ

  12. xiaobing259 ÓÚ 2010-11-29 14:37:37·¢±í:

    {:3_107:}

  13. xue_1103 ÓÚ 2010-11-23 15:06:38·¢±í:

    ºÃ¶«Î÷£¬ÊÕ²Ø

  14. ѩɽʨ×Ó ÓÚ 2010-09-27 20:28:16·¢±í:

    ÊܽÌÁË

  15. maoyin123 ÓÚ 2010-09-25 20:03:09·¢±í:

    Õâɶ¸úɶѽ£¬Ð´Õâô¶à£¬À´µãʵÓõÄ

  16. ÃÞ°À¼Ó¶Ì¿ã ÓÚ 2010-09-23 15:46:54·¢±í:

    :0()w(1

  17. ÃÞ°À¼Ó¶Ì¿ã ÓÚ 2010-09-22 15:15:26·¢±í:

    {:2_91:}

  18. pengdekai5 ÓÚ 2010-09-22 06:19:32·¢±í:

    ºÜºÃºÜÇ¿´ó~£¡£¡

  19. pengdekai5 ÓÚ 2010-09-22 06:19:27·¢±í:

    ºÜºÃºÜÇ¿´ó~£¡£¡

  20. lvhuan198988 ÓÚ 2010-09-21 10:35:40·¢±í:

    zhizhizhzihzihds;kljh;fkljs;dlfkjgklwdfgh

  21. zhangbohtz ÓÚ 2010-02-04 18:01:52·¢±í:

    ¹þ¹þ

  22. yarges ÓÚ 2010-02-03 11:50:56·¢±í:

    ´ó¸çÄܲ»ÄܾßÌå½éÉÜÒ»ÏÂipv6ºÍipv4µÄ»¥²Ù×÷ÐÔ

  23. sherwinwang ÓÚ 2009-12-24 23:39:50·¢±í:

    thanks for sharing!

  24. longyun ÓÚ 2009-12-21 20:06:58·¢±í:

    °ïÂ¥Ö÷°ÑÎļþ²¹È«£¬Ï£ÍûÂ¥Ö÷Ï´ΰɳÌÐòдÍêÕû£¬·ñÔò³õѧÕß»áһͷÎíË®µÄ£¡¼ÓÓÍ£¡
    #include
    #include
    #include
    #include
    #include
    #include
    #include

  25. longyun ÓÚ 2009-12-11 19:09:42·¢±í:

    Â¥Ö÷£¬×îºÃÄÜ·¢Ð©Ïà¹ØÊé¼® лл

  26. k2eats ÓÚ 2007-09-22 11:19:16·¢±í:

    ²»´í£¬ºÃ¶«Î÷

  27. huangchun ÓÚ 2007-04-30 10:43:39·¢±í:

    ²»´í ллÁË

  28. yanch ÓÚ 2006-09-29 15:14:35·¢±í:

    Ϊʲô#includeºóÃæûÓж«Î÷ѽ!

  29. ǧֽº× ÓÚ 2006-09-27 10:29:38·¢±í:

    ÓкöàÎÄÕ¶¼ÊǽéÉܹØÓÚ¿Í»§¶ËÓë·þÎñÆ÷¶ÎµÄÁ¬½ÓÎÊÌâ
    ÓÐûÓйØÓÚ´«ËÍÒ»¸öÎļþµÄ֪ʶÄØ£¿ÀýÈçһƪÎÄÕ»òÕßÒ»¸öÍøÕ¾µÄHTMLÔ´´úÂëʲôµÄ¡£

  30. 61.144.42.* ÓÚ 2006-07-13 22:40:11·¢±í:

    Äܲ»ÄÜÌùһЩ¸üÉîµÄ£¬±ÈÈç˵£¬ÎÒ×î½üÕýÔÚдһ¸ö´úÀíFTP°üµÄ´úÀí·þÎñÆ÷³ÌÐò£¬¿àÎÞ×ÊÁϲ鿴£¡^_^!»¶Ó­ÁªÂç:l-xiangjiaoxian@126.com

  31. 61.144.42.* ÓÚ 2006-07-13 22:40:01·¢±í:

    Äܲ»ÄÜÌùһЩ¸üÉîµÄ£¬±ÈÈç˵£¬ÎÒ×î½üÕýÔÚдһ¸ö´úÀíFTP°üµÄ´úÀí·þÎñÆ÷³ÌÐò£¬¿àÎÞ×ÊÁϲ鿴£¡^_^!»¶Ó­ÁªÂç:l-xiangjiaoxian@126.com

  32. 61.144.42.* ÓÚ 2006-07-13 22:38:17·¢±í:

    Äܲ»ÄÜÌùһЩ¸üÉîµÄ£¬±ÈÈç˵£¬ÎÒ×î½üÕýÔÚдһ¸ö´úÀíFTP°üµÄ´úÀí·þÎñÆ÷³ÌÐò£¬¿àÎÞ×ÊÁϲ鿴£¡^_^!

  33. huanglu ÓÚ 2006-04-13 23:42:51·¢±í:

    socket ÓзÇ×èÈûºÍ×èÈûÁ½ÖÖ·½Ê½£¬ÎÒÔÚÍøÉÏ¿´µ½·Ç×èÈûµÄ²ÅÖ§³Ö¶à¸ö¿Í»§¶ËµÄÁ¬½Ó£®£¿£¿

  34. RedSnow ÓÚ 2005-11-20 23:11:16·¢±í:

    ½øÐÐlinux cÍøÂç±à³Ì£¬ÐèÒªÉîÈëÁ˽âlinux c¿âº¯Êý²Î¿¼ÊÖ²áµÄÏà¹ØÄÚÈÝ£¬±Ø²»¿ÉÉÙµÄÊǵÚ19ÕÂ-SocketÏà¹Øº¯Êý£¬µ«¹ØÓÚÕâÒ»²¿·Ö£¬ÓÉÓÚ°æ±¾µÄ²»Í¬£¬ÏàÓ¦µÄÊý¾Ý½á¹¹ÖеÄÊý¾ÝÀàÐÍ×ֶζàÉÙÓгöÈ룬±ÈÈ磺
    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];
    };¡¡ºÍ
    struct sockaddr_in {
    unsiged short int sin_len;
    short int sin_family;
    unsiged short int sin_port;
    struct in_addr sin_addr;
    unsiged char sin_zero[8];
    };
    ....µ±È»£¬»¹ÓÐÆäËûд·¨[ÖÁÉÙÎÒ¼û¹ý£¬²¢²»½ö½ö¾ÖÏÞÓÚ´Ë]£¬ÓÐʱºÜÄÑ°ÑÎÕËüÃǵ½µ×ΪºÎÖÖÊý¾ÝÀàÐÍ£¬Òò¶ø£¬ÔÚ±à³Ìʱ»áÓжദ¾¯¸æÓÉ´ËÒýÆð¡£
    ÔÚ´Ë£¬Çë½ÌÖîλͬÈÊ£¬linux c¿âº¯Êý²Î¿¼ÊÖ²á×îаæÊÇÄÄÒ»°æ£¿ÄÜ·ñ¹²Ïíһϣ¿....лл£¡£¡£¡¡¡¡¡¡¡¡¡¡¡

  35. cheshi ÓÚ 2005-11-12 11:02:21·¢±í:

    ºÃ¶«Î÷£¬ÊÕ²ØÁË£¬¸ÐлING

  36. ·çÓêÎÞ×è ÓÚ 2005-09-29 00:21:39·¢±í:

    ²»´í£¬Ö§³Ö

  37. WWW ÓÚ 2005-09-02 00:22:49·¢±í:

    Ö§³Ö

  38. ming ÓÚ 2005-07-20 00:09:11·¢±í:

    Ö§³Ö

  39. Â¥À¼Õ½Ê¿ ÓÚ 2005-06-16 15:57:51·¢±í:

    Èç¹ûÎÒ²»¿ª·¢¿Í»§¶Ë³ÌÐò¡£¶øÊÇͨ¹ýä¯ÀÀÆ÷·ÃÎÊ·þÎñÆ÷µÄÒѾ­´ò¿ªµÄ¶Ë¿Ú£¬ÈçºÎ°ÑÏëÊä³öµÄÄÚÈÝÊä³öµ½ä¯ÀÀÆ÷¡£Ò²¾ÍÊÇÓÃcÓïÑÔʵÏÖhttp·þÎñÆ÷¡£