ÔÚTCP/IPÍøÂç½á¹¹ÖУ¬ÎªÁ˱£Ö¤ÍøÂ簲ȫ£¬ÍøÂçÈËÔ±ÍùÍùÐèÒªÔÚ·ÓÉÆ÷ÉÏÌí¼Ó·À»ðǽ£¬½ûÖ¹·Ç·¨Óû§ÓÃftpµÈ°²È«Î£º¦½Ï´óµÄTCP/IPÐÒé·ÃÎÊÖ÷»ú¡£¶øÓÐʱϵͳά»¤ÈËÔ±ÐèÒªÓÃftp½«Ò»Ð©Îļþ´ÓÖÐÐÄ»ú·¿Ö÷»ú´«µ½Ç°¶ËÍøµãÖ÷»úÉÏ£¬±ÈÈçÓ¦ÓóÌÐòµÄÌæ»»Éý¼¶¡£Èç¹ûÿ´Î´«ÊäÎļþʱ¶¼Òª´ò¿ª·À»ðǽ£¬Î´ÃâÏÔµÃÓÐЩ·±Ëö£¬ÒªÊÇÔÚ×Ô¼ºµÄÓ¦ÓóÌÐòÖÐÔö¼ÓÒ»¸öרÃŵÄÎļþ´«ÊäÄ£¿é£¬Äǽ«ÊÇÊ®·ÖÓä¿ìµÄÊÂÇé¡£
¡¡¡¡UNIXÍøÂç³ÌÐòÉè¼ÆÒ»°ã¶¼²ÉÓÃÌ×½Ó×Ö(socket)ϵͳµ÷Óá£Õë¶ÔÄ¿Ç°Ê®·ÖÁ÷ÐеĿͻ§/·þÎñÆ÷ģʽ£¬Æä³ÌÐò±àд²½ÖèÈçÏ£º
¡¡¡¡1.Socketϵͳµ÷ÓÃ
¡¡¡¡ÎªÁ˽øÐÐÍøÂçI/O£¬·þÎñÆ÷ºÍ¿Í»§»úÁ½¶ËµÄUNIX½ø³ÌÒª×öµÄµÚÒ»¼þÊÂÊǵ÷ÓÃsocket()ϵͳµ÷Ó㬽¨Á¢Èí²å×ù£¬Ö¸Ã÷ºÏÊʵÄͨѶÐÒé¡£¸ñʽΪ£º
¡¡¡¡££include;
¡¡¡¡££include;
¡¡¡¡int socket(int family,int type,int protocol)
¡¡¡¡ÆäÖУº(1)familyÖ¸Ã÷Ì×½Ú×Ö×壬ÆäÖµ°üÀ¨£º
¡¡¡¡AF_UNIX¡¡¡¡ (UNIXÄÚ²¿ÐÒé×å)
¡¡¡¡AF_INET¡¡¡¡ (IternetÐÒé)
¡¡¡¡AF_NS (XeroxNsÐÒ飬TCP/IP±à³ÌÈ¡¸ÃÖµ)
¡¡¡¡AF_IMPLINK¡¡ (IMPÁ´½Ó²ã)
¡¡¡¡(2)type Ö¸Ã÷Ì×½Ó×ÖÀàÐÍ£¬È¡ÖµÓУº
¡¡¡¡SOCK_STREAM ¡¡¡¡¡¡¡¡(Á÷Ì×½Ó×Ö)
¡¡¡¡SOCK_DGRAM ¡¡¡¡¡¡¡¡(Êý¾Ý±¨Ì×½Ó×Ö)
¡¡¡¡SOCK_RAW¡¡ ¡¡¡¡¡¡¡¡(ÔʼÌ×½Ó×Ö)
¡¡¡¡SOCK_SEQPACKET¡¡¡¡ (¶¨Ðò·Ö×éÌ×½Ó×Ö)
¡¡¡¡Ò»°ãÇé¿öÏ£¬Ç°Á½¸ö²ÎÊýµÄ×éºÏ¾Í¿ÉÒÔ¾ö¶¨ËùʹÓõÄÐÒ飬ÕâʱµÚÈý¸ö²ÎÊý±»ÖÃΪ0£¬Èç¹ûµÚÒ»¸ö²ÎÊýΪAF_INET£¬µÚ¶þ¸ö²ÎÊýÑ¡SOCK_STREAM£¬ÔòʹÓõÄÐÒéΪTCP£»µÚ¶þ¸ö²ÎÊýÑ¡SOCK_DGRAM£¬ÔòʹÓõÄÐÒéΪUDP£»µ±µÚ¶þ¸ö²ÎÊýÑ¡SOCK_RAWʱ£¬Ê¹ÓõÄÐÒéΪIP¡£ÖµµÃÖ¸³öµÄÊDz¢²»ÊÇËùÓеÄ×åºÍÀàÐ͵Ä×éºÏ¶¼ÊǺϷ¨µÄ£¬¾ßÌåÇë²éÔÄÏà¹Ø×ÊÁÏ¡£¸Ãϵͳµ÷ÓÃÈô³É¹¦Ôò·µ»ØÒ»¸öÀàËÆÎļþÃèÊö·û£¬³ÉΪÌ×½Ú×ÖÃèÊö×Ö£¬¿ÉÒÔÏñÎļþÃèÊö·ûÄÇÑùÓÃreadºÍwrite¶ÔÆä½øÐÐI/O²Ù×÷¡£µ±Ò»¸ö½ø³ÌʹÓÃÍê¸ÃÈí²å×ùʱ£¬ÐèÓÃclose(¹Ø±Õ(¾ßÌå¼ûºóÃæÄÚÈÝ)¡£
¡¡¡¡2.·þÎñÆ÷¶ËBindϵͳµ÷ÓÃ
¡¡¡¡Èí²å×ù´´½¨Ê±²¢Ã»ÓÐÓëÈκεØÖ·Ïà¹ØÁª£¬±ØÐëÓÃbind()ϵͳµ÷ÓÃΪÆ佨Á¢µØÖ·ÁªÏµ¡£Æä¸ñʽΪ£º
¡¡¡¡££include;
¡¡¡¡££include;
¡¡¡¡int bind(int socketfd,struct sockaddr_in £ªlocaladdr,sizeof(localaddr));
¡¡¡¡ÆäÖУº(1)µÚÒ»¸ö²ÎÊýsocketfdÊÇÇ°²½socket()ϵͳµ÷Ó÷µ»ØµÄÌ×½Ú×ÖÃèÊö·û¡£
¡¡¡¡(2)µÚ¶þ¸ö²ÎÊý±»À¦Ïò±¾µØµØÖ·µÄÒ»Öֽṹ£¬¸Ã½á¹¹ÔÚsys/netinet/in.hÖж¨Ò壺
¡¡¡¡struct sockaddr_in{
¡¡¡¡¡¡short sin_family;/£ªsocket()ϵͳµ÷ÓõÄÐÒé×åÈçAF_INET£ª/
¡¡¡¡¡¡u_short sin_port;/£ªÍøÂç×Ö½Ú´ÎÐòÐÎʽµÄ¶Ë¿ÚºÅÂ룪/
¡¡¡¡¡¡struct in_addr sin_addr;/£ªÍøÂç×Ö½Ú´ÎÐòÐÎʽµÄÍøÂçµØÖ·£ª/
¡¡¡¡¡¡char sin_zero[8];
¡¡¡¡}
¡¡¡¡Ò»Ì¨»úÆ÷ÉϵÄÿ¸öÍøÂç³ÌÐòʹÓÃÒ»¸ö¸÷×Ô¶ÀÁ¢µÄ¶Ë¿ÚºÅÂ룬ÀýÈ磺telnet³ÌÐòʹÓö˿ںÅ23£¬¶øftpÎļþ´«Êä³ÌÐòʹÓö˿ںÅ21¡£ÎÒÃÇÔÚÉè¼ÆÓ¦ÓóÌÐòʱ£¬¶Ë¿ÚºÅÂë¿ÉÒÔÓÉgetservbyname()º¯Êý´Ó/etc/services¿âÎļþÖлñÈ¡£¬Ò²¿ÉÒÔÓÉhtons (int portnum)º¯Êý½«ÈÎÒâÕýÕûÊýת»»ÎªÍøÂç×Ö½Ú´ÎÐòÐÎʽÀ´µÃµ½£¬ÓÐЩ°æ±¾µÄUNIX²Ù×÷ϵͳÔò¹æ¶¨1024ÒÔϵĶ˿ںÅÂëÖ»¿É±»³¬¼¶Óû§Ê¹Óã¬ÆÕͨÓû§³ÌÐòʹÓõĶ˿ںÅÂëÖ»ÏÞÓÚ1025µ½32767Ö®¼ä¡£ÍøÂçµØÖ·¿ÉÒÔÓÉgethostbyname(char£ªhostname)º¯ÊýµÃµ½(¸Ãº¯ÊýºÍgetservbyname()Ò»Ñù¶¼ÒÔÍøÂç×Ö½Ú´ÎÐòÐÎʽ·µ»ØËùÓÐÔÚËûÃǽṹÖеÄÊý¾Ý)£¬²ÎÊýhostnameΪ/etc/hostsÎļþÖÐijһÍøÂçµØÖ·Ëù¶ÔÓ¦µÄ»úÆ÷Ãû¡£¸Ãº¯Êý·µ»ØÒ»¸öÀàÐÍΪhostentµÄ½á¹¹Ö¸Õ룬hostent½á¹¹ÔÚnetdb.hÖж¨Ò壺
¡¡¡¡struct hostent{
¡¡¡¡ char £ªh_name;
¡¡¡¡ char £ª£ªh_aliases;
¡¡¡¡ int h_addrtype;
¡¡¡¡ int h_length;¡¡¡¡/£ªµØÖ·³¤¶È£ª/
¡¡¡¡ char £ª£ªh_addr_list;
¡¡¡¡ ££define h_addr h_addr_list[0];/£ªµØÖ·£ª/
¡¡¡¡}
¡¡¡¡(3)µÚÈý¸ö²ÎÊýΪµÚ¶þ¸ö½á¹¹²ÎÊýµÄ³¤¶È£¬Èç¹ûµ÷Óóɹ¦£¬bind·µ»Ø0£¬·ñÔò½«·µ»Ø£1²¢ÉèÖÃerrno¡£
¡¡¡¡3.·þÎñÆ÷¶Ëϵͳµ÷ÓÃlisten£¬Ê¹·þÎñÆ÷Ô¸Òâ½ÓÊÜÁ¬½Ó
¡¡¡¡¸ñʽ£ºint listen(int socketfd,int backlong)
¡¡¡¡Ëüͨ³£ÔÚsocketºÍbindµ÷ÓúóÔÚacceptµ÷ÓÃÇ°Ö´ÐС£µÚ¶þ¸ö²ÎÊýÖ¸Ã÷Ôڵȴý·þÎñÆ÷Ö´ÐÐacceptµ÷ÓÃʱϵͳ¿ÉÒÔÅŶӶàÉÙ¸öÁ¬½ÓÒªÇ󡣴˲ÎÊý³£Ö¸¶¨Îª5£¬Ò²ÊÇÄ¿Ç°ÔÊÐíµÄ×î´óÖµ¡£
¡¡¡¡4.·þÎñÆ÷µ÷ÓÃaccept,ÒԵȴý¿Í»§»úµ÷ÓÃconnect½øÐÐÁ¬½Ó¡£¸ñʽÈçÏ£º
¡¡¡¡int newsocket=(int socketfd,struct sockaddr_in £ªpeer,int£ªaddrlen);
¡¡¡¡¸Ãµ÷ÓÃÈ¡µÃ¶ÓÁÐÉϵĵÚÒ»¸öÁ¬½ÓÇëÇó²¢½¨Á¢Ò»¸ö¾ßÓÐÓësockfdÏàͬÌØÐÔµÄÌ×½Ú×Ö¡£Èç¹ûûÓеȴýµÄÁ¬½ÓÇëÇ󣬴˵÷ÓÃ×èÈûµ÷ÓÃÕßÖ±µ½Ò»Á¬½ÓÇëÇóµ½´ï¡£Á¬½Ó³É¹¦ºó£¬¸Ãµ÷Óý«ÓöԶ˵ĵØÖ·½á¹¹ºÍµØÖ·³¤¶ÈÌî³ä²ÎÊýpeerºÍaddlen£¬Èç¹û¶Ô¿Í»§¶ËµÄµØÖ·ÐÅÏ¢²»¸ÐÐËȤ£¬ÕâÁ½¸ö²ÎÊýÓÃ0´úÌæ¡£
¡¡¡¡5.¿Í»§¶Ëµ÷ÓÃconnect()Óë·þÎñÆ÷½¨Á¢Á¬½Ó¡£¸ñʽΪ£º
¡¡¡¡connect(int socketfd,struct sockaddr_in £ªservsddr,int addrlen)
¡¡¡¡¿Í»§¶ËÈ¡µÃÌ×½Ó×ÖÃèÊö·ûºó£¬Óøõ÷Óý¨Á¢Óë·þÎñÆ÷µÄÁ¬½Ó£¬²ÎÊýsocketfdΪsocket()ϵͳµ÷Ó÷µ»ØµÄÌ×½Ú×ÖÃèÊö·û£¬µÚ¶þºÍµÚÈý¸ö²ÎÊýÊÇÖ¸ÏòÄ¿µÄµØÖ·µÄ½á¹¹¼°ÒÔ×Ö½Ú¼ÆÁ¿µÄÄ¿µÄµØÖ·µÄ³¤¶È(ÕâÀïÄ¿µÄµØַӦΪ·þÎñÆ÷µØÖ·)¡£µ÷Óóɹ¦·µ»Ø0£¬·ñÔò½«·µ»Ø£1²¢ÉèÖÃerrno¡£
¡¡¡¡6.ͨ¹ýÈí²å×ù·¢ËÍÊý¾Ý
¡¡¡¡Ò»µ©½¨Á¢Á¬½Ó£¬¾Í¿ÉÒÔÓÃϵͳµ÷ÓÃreadºÍwriteÏñÆÕͨÎļþÄÇÑùÏòÍøÂçÉÏ·¢ËͺͽÓÊÜÊý¾Ý¡£Read½ÓÊÜÈý¸ö²ÎÊý£ºÒ»¸öÊÇÌ×½Ú×ÖÃèÊö·û£»Ò»¸öΪÊý¾Ý½«±»ÌîÈëµÄ»º³åÇø£¬»¹ÓÐÒ»¸öÕûÊýÖ¸Ã÷Òª¶ÁµÄ×Ö½ÚÊý£¬Ëü·µ»Øʵ¼Ê¶ÁÈëµÄ×Ö½ÚÊý£¬³ö´íʱ·µ»Ø£1£¬Óöµ½ÎļþβÔò·µ»Ø0¡£WriteÒ²½ÓÊÜÈý¸ö²ÎÊý£ºÒ»¸öÊÇÌ×½Ú×ÖÃèÊö·û£»Ò»¸öΪָÏòÐèÒª·¢ËÍÊý¾ÝµÄ»º³åÇø£¬»¹ÓÐÒ»¸öÕûÊýÖ¸Ã÷ҪдÈëÎļþµÄ×Ö½Ú¸öÊý£¬Ëü·µ»Øʵ¼ÊдÈëµÄ×Ö½ÚÊý£¬³ö´íʱ·µ»Ø£1¡£µ±È»£¬Ò²¿ÉÒÔµ÷ÓÃsendºÍrecvÀ´¶ÔÌ×½Ú×Ö½øÐжÁд£¬Æäµ÷ÓÃÓë»ù±¾µÄreadºÍwriteϵͳµ÷ÓÃÏàËÆ£¬Ö»ÊǶàÁËÒ»¸ö·¢ËÍ·½Ê½²ÎÊý¡£
¡¡¡¡7.Í˳ö³ÌÐòʱ£¬Ó¦°´Õý³£·½Ê½¹Ø±ÕÌ×½Ú×Ö¡£¸ñʽÈçÏ£º
¡¡¡¡int close(socketfd)
¡¡¡¡Ç°Ãæ½éÉÜÁËUNIX¿Í»§/·þÎñÆ÷ģʽÍøÂç±à³ÌµÄ»ù±¾Ë¼Â·ºÍ²½Öè¡£ÖµµÃÖ¸³öµÄÊÇsocket±à³ÌËùÉæ¼°µÄϵͳµ÷Óò»ÊôÓÚ»ù±¾ÏµÍ³µ÷Ó÷¶Î§£¬Æ亯ÊýÔÐÎÔÚlibsocket.aÎļþÖУ¬Òò´Ë£¬ÔÚÓÃccÃüÁî¶ÔÔ³ÌÐò½øÐбàÒëʱÐèÒª´ø£lsocketÑ¡Ïî¡£
¡¡¡¡ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔÕë¶ÔÎÄÕ¿ªÍ·Ìá³öµÄÎÊÌâ×ÅÊÖ½øÐбà³ÌÁË¡£ÔÚͼʾµÄÍøÂç½á¹¹ÖУ¬ÎªÊ¹ÖÐÐÄ»ú·¿µÄ·þÎñÆ÷ÄܺÍÍøµãÉϵĿͻ§»ú½øÐÐͨÐÅ£¬ÐèÔÚ·þÎñÆ÷¶ËÌí¼Óͨ¹ý·ÓÉÆ÷1ª±1ª±1ª±2µ½¿Í»§»úµÄ·ÓÉ£¬Á½Ì¨¿Í»§»úÒ²±ØÐëÌí¼Óͨ¹ý·ÓÉÆ÷2ª±2ª±2ª±1µ½·þÎñÆ÷µÄ·ÓÉ¡£ÔÚ·þÎñÆ÷µÄ/etc/hostsÎļþÖÐÓ¦¸Ã°üº¬ÏÂÃæÄÚÈÝ£º
¡¡¡¡1.1.1.1¡¡¡¡server
¡¡¡¡2.2.2.2¡¡¡¡cli1
¡¡¡¡2.2.2.3¡¡¡¡cli2
¡¡¡¡¿Í»§»úµÄ/etc/hostsÎļþÖÐÓ¦¸ÃÓб¾»úµØÖ·ÐÅÏ¢ºÍ·þÎñÆ÷µÄµØÖ·ÐÅÏ¢£¬Èçcli1¿Í»§»úµÄ/etc/hostsÎļþ£º
¡¡¡¡2.2.2.2¡¡¡¡cli1
¡¡¡¡1.1.1.1¡¡¡¡server
¡¡¡¡ÍøÂç»·¾³´î½¨ºÃºó£¬ÎÒÃÇ¿ÉÒÔÔÚ·þÎñÆ÷¶Ë±àдfwq.c³ÌÐò£¬¸ºÔð½ÓÊÜ¿Í»§»úµÄÁ¬½ÓÇëÇ󣬲¢½«´ÓÔ´ÎļþÖжÁÈ¡µÄÊý¾Ý·¢Ë͵½¿Í»§»ú¡£¿Í»§»ú³ÌÐòkhj.cÏò·þÎñÆ÷·¢ËÍÁ¬½ÓÇëÇ󣬽ÓÊÕ´Ó·þÎñÆ÷¶Ë·¢À´µÄÊý¾Ý£¬²¢½«½ÓÊÕµ½µÄÊý¾ÝдÈëÄ¿±êÎļþ¡£Ô´³ÌÐòÈçÏ£º
/£ª·þÎñÆ÷Ô´³ÌÐòfwq.c£ª/
££include;
££include;
££include;
££include;
££include;
££include;
££include;
main()
{
¡¡¡¡char c,buf[1024],file[30];
¡¡¡¡int fromlen,source;
¡¡¡¡register int k,s,ns;
¡¡¡¡struct sockaddr_in sin;
¡¡¡¡struct hostent £ªhp;
¡¡¡¡system(¡åclear¡å);
¡¡¡¡printf(¡å\n¡å);
¡¡¡¡
¡¡¡¡printf(¡å\n\n\t\tÊäÈëÒª´«ÊäµÄÎļþÃû£º¡å)£»
¡¡¡¡scanf(¡å£¥s¡å,file);
¡¡¡¡if ((source=open(file,O_RDONLY));h_length);
¡¡¡¡if(bind(s,£¦sin,sizeof(sin))