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

LinuxÖÐBSDÌ×½Ó¿Ú¿ª·¢µÄ»ù´¡½éÉÜ

·¢²¼Ê±¼ä:2006-03-28 01:21:24À´Ô´:ºìÁª×÷Õß:root
¡¡ÕâÊǹØÓÚÈçºÎÓø÷ÖÖ¿ÉÒԵõ½µÄ½Ó¿ÚΪLinux¿ª·¢ÍøÂç³ÌÐòµÄϵÁÐÎÄÕµĵÚһƪ¡£¾ÍÏñ´ó¶àÊýUnix-basedµÄ²Ù×÷ϵͳһÑù£¬LinuxÖ§³Ö½«TCP/IP×÷Ϊ±¾µØµÄÍøÂç´«ÊäЭÒé¡£ÔÚÕâ¸öϵÁÐÖУ¬ÎÒÃǼٶ¨ÄãÒѾ­±È½ÏÊìϤLinuxÉϵÄC±à³ÌºÍLinuxµÄһЩϵͳ֪ʶÖîÈçsignals,forkingµÈµÈ¡£

¡¡¡¡ÕâƪÎÄÕÂÊǹØÓÚÈçºÎÓÃBSDÌ×½Ó¿Ú´´½¨ÍøÂç³ÌÐòµÄ»ù´¡½éÉÜ ¡£ÔÚÏÂһƪÖУ¬ÎÒÃÇ»á½â¾öÉæ¼°µ½½¨Á¢(ÍøÂç)deamon½ø³ÌµÄÎÊÌâ¡£¶øÇÒ½ñºóµÄÎÄÕÂÎÒÃÇ»¹»áÉæ¼°µ½Ê¹ÓÃÔ¶³Ì¹ý³Ìµ÷ÓÃ(RPC)£¬ÒÔ¼°ÓÃCORBA/distributed objects½øÐпª·¢¡£

¡¡¡¡Ò»¡¢TCP/IPµÄ»ù´¡½éÉÜ

¡¡¡¡TCP/IPЭÒé×åÔÊÐíÁ½¸öÔËÐÐÔÚͬһ̨µçÄÔ»òÕßÓÉÍøÂçÁ¬½ÓÔÚÒ»ÆðµÄÁ½Ì¨µçÄÔÉϵijÌÐò½øÐÐͨѶ¡£Õâ¸öЭÒé×åÊÇרÃÅΪÁËÔÚ²»¿É¿¿µÄÍøÂçÉϽøÐÐͨѶÉè¼ÆµÄ¡£TCP/IPÔÊÐíÁ½¸ö»ù±¾µÄ²Ù×÷ģʽ----ÃæÏòÁ¬½ÓµÄ¿É¿¿µÄ´«Êä(Ö¸TCP)ºÍÎÞÁ¬½ÓµÄ(connectionless)²»¿É¿¿µÄ´«Êä(UDP)¡£

¡¡¡¡TCPÌṩ´øÓжÔÉϲãЭÒé͸Ã÷µÄÖм̹¦Äܵģ¬Ë³ÐòµÄ£¬¿É¿¿µÄ£¬Ë«ÏòµÄ(bi-directional),ÒÔÁ¬½ÓΪ»ù´¡µÄ×Ö½Ú´«ÊäÁ÷¡£TCP½«ÄãµÄÐÅÏ¢·Ö¸î³ÉÊý¾Ý±¨(²»´óÓÚ64kb)²¢±£Ö¤ËùÓеÄÊý¾Ý±¨ÎÞÎóµÄ°´ÕÕ˳Ðò¶¼µ½´ïÄ¿µÄµØ¡£ÓÉÓÚÒÔÁ¬½ÓΪ»ù´¡£¬ËùÒÔÒ»¸öÐéÄâÁ¬½Ó±ØÐëÔÚÒ»¸öÍøÂçʵÌå(network entity)ºÍÁíÒ»¸öÖ®¼ä½øÐÐͨÐÅÇ°½¨Á¢¡£UDPÏà·´ÔòÌṩһ¸ö(·Ç³£¿ìµÄ)ÎÞÁ¬½ÓµÄ²»¿É¿¿ÏûÏ¢´«Êä(ÏûÏ¢µÄ´óСÊÇÒ»¸öÈ·¶¨µÄ×î´ó³¤¶È)¡£

¡¡¡¡ÎªÁËʹ³ÌÐò¼ä¿ÉÒÔÏ໥ͨÐÅ£¬²»ÂÛËûÃÇÊÇÔÚͬһ¸ö»úÆ÷(ͨ¹ýloopback½Ó¿Ú)»¹ÊDz»Í¬Ö÷»ú£¬Ã¿Ò»¸ö³ÌÐò¶¼±ØÐëÓжÀÁ¢µÄµØÖ·¡£

¡¡¡¡TCP/IPµØÖ·ÓÉÁ½²¿·Ö×é³É----ÓÃÀ´±æ±ð»úÆ÷µÄIPµØÖ·ºÍÓÃÀ´±æ±ðÔÚÄÇ̨»úÆ÷ÉϵÄÌض¨³ÌÐòµÄ¶Ë¿ÚµØÖ·¡£

¡¡¡¡µØÖ·¿ÉÒÔÊǵã·Ö(dotted-quad)·ûºÅÐÎʽµÄ(È磬127.0.0.1)»òÕßÊÇÖ÷»úÃûÐÎʽµÄ(È磬www.csdn.net)¡£ÏµÍ³¿ÉÒÔʹÓÃ/etc/hosts»òDNSÓòÃû·þÎñ(Èç¹û¿ÉÒÔ»ñµÃµÄ»°)½øÐÐÖ÷»úÃûµ½µã·Ö·ûºÅµØÖ·(Ò²¾ÍÊÇIPµØÖ·)µÄת»»¡£

¡¡¡¡¶Ë¿Ú´Ó1ºÅ¿ªÊ¼±àºÅ¡£1ºÍIPP0RT_RESERVED(ÔÚ/usr/include/netinet/in.hÖж¨Ò壬ͨ³£Îª1024)Ö®¼äµÄ¶Î¿ÚºÅ±£Áô¸øϵͳʹÓÃ(Ò²¾ÍÊÇ˵£¬Äã±ØÐëÒÔrootµÄÉí·Ý½¨Á¢Ò»¸öÍøÂç·þÎñÀ´°ó¶¨Õⲿ·ÖµÄ¶Ë¿Ú)¡£

¡¡¡¡×î¼òµ¥µÄÍøÂç³ÌÐò´ó¶¼ÓõĿͻ§-·þÎñÆ÷Ä£ÐÍ¡£Ò»¸ö·þÎñ½ø³ÌµÈ´ýÒ»¸ö¿Í»§½ø³ÌÁ¬½ÓËû¡£µ±Á¬½Ó½¨Á¢Ê±£¬·þÎñÆ÷´ú±í¿Í»§Ö´ÐÐÌض¨µÄÈÎÎñ£¬Í¨³£ÕâÕâÒÔºóÁ¬½Ó¾ÍÖжÏÁË¡£

¡¡¡¡¶þ¡¢Ê¹ÓÃBSDÌ×½Ó¿Ú½çÃæ

¡¡¡¡×îͨÐеÄTCP/IP±à³Ì·½·¨¾ÍÊÇʹÓÃBSDÌ×½Ó¿Ú½çÃæ±à³Ì¡£Í¨¹ýËü£¬ÍøÂç¶Ëµã(network endpoints)(IPµØÖ·ºÍ¶Ë¿ÚµØÖ·)ÒÔÌ×½Ó¿Ú(sockets)µÄÐÎʽ³öÏÖ¡£

¡¡¡¡ÕâÌ×Ì×½Ó¿ÚIPC(interprocess communication£¬½ø³Ì¼äͨѶ)ÉèÊ©(´Ó4.2BSD¿ªÊ¼ÒýÈë)µÄÉè¼ÆÊÇΪÁËÄÜÈÃÍøÂç³ÌÐòµÄÉè¼ÆÄܹ»¶ÀÁ¢ÓÚ²»Í¬µÄµ×²ãͨÐÅÉèÊ©¡£

¡¡¡¡1¡¢½¨Á¢Ò»¸ö·þÎñÆ÷³ÌÐò

¡¡¡¡ÒªÊ¹ÓÃBSD½çÃ潨Á¢Ò»¸ö·þÎñÆ÷³ÌÐò£¬Äã±ØÐëͨ¹ýÒÔϲ½Ö裺

¡¡¡¡£¨1£©Í¨¹ýº¯Êýsocket()½¨Á¢Ò»¸öÌ×½Ó¿Ú
¡¡¡¡£¨2£©Í¨¹ýº¯Êýbind()°ó¶¨Ò»¸öµØÖ·(IPµØÖ·ºÍ¶Ë¿ÚµØÖ·)¡£ÕâÒ»²½È·¶¨ÁË·þÎñÆ÷µÄλÖã¬Ê¹¿Í»§¶ËÖªµÀÈçºÎ·ÃÎÊ¡£
¡¡¡¡£¨3£©Í¨¹ýº¯Êýlistem()¼àÌý(listen)¶Ë¿ÚµÄеÄÁ¬½ÓÇëÇó¡£
¡¡¡¡£¨4£©Í¨¹ýº¯Êýaccept()½ÓÊÜеÄÁ¬½Ó¡£

¡¡¡¡Í¨³££¬Î¬»¤´ú±íÁË¿Í»§µÄÇëÇó¿ÉÄÜÐèÒª»¨·ÑÏ൱³¤µÄÒ»¶Îʱ¼ä¡£ÔÚ´¦ÀíÒ»¸öÇëÇóʱ£¬½ÓÊպʹ¦ÀíеÄÇëÇóÒ²Ó¦¸ÃÊǸßЧµÄ¡£´ïµ½ÕâÖÖÄ¿µÄµÄ×îͨ³£µÄ×ö·¨ÊÇÈ÷þÎñÆ÷ͨ¹ýfork()º¯Êý¿½±´Ò»·Ý×Ô¼ºµÄ½ø³ÌÀ´½ÓÊÜеÄÁ¬½Ó¡£

¡¡¡¡ÒÔϵÄÀý×ÓÏÔʾÁË·þÎñÆ÷ÊÇÈçºÎÓÃCʵÏֵģº

/*
* Simple "Hello, World!" server
* Ivan Griffin (ivan.griffin@ul.ie)
*/

/* Hellwolf Misty translated */

#include /* */
#include /* exit() */
#include /* memset(), memcpy() */
#include /* uname() */
#include
#include¡¡¡¡/* socket(), bind(),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ listen(), accept() */
#include
#include
#include
#include /* fork(), write(), close() */


/*
* constants
*/
const char MESSAGE[] = "Hello, World!\n";
const int BACK_LOG = 5;

/*

*³ÌÐòÐèÒªÒ»¸öÃüÁîÐвÎÊý£ºÐèÒª°ó¶¨µÄ¶Ë¿ÚºÅ
*/
int main(int argc, char *argv[])
{
¡¡¡¡int serverSocket = 0,
¡¡¡¡¡¡¡¡on = 0,
¡¡¡¡¡¡¡¡port = 0,
¡¡¡¡¡¡¡¡status = 0,
¡¡¡¡¡¡¡¡childPid = 0;
¡¡¡¡struct hostent *hostPtr = NULL;
¡¡¡¡char¡¡ hostname[80] = "";
¡¡¡¡struct sockaddr_in serverName = { 0 };

¡¡¡¡if (2 != argc)
¡¡¡¡{
¡¡¡¡¡¡¡¡fprintf(stderr, "Usage: %s \n",
argv[0]);
¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡}
¡¡¡¡port = atoi(argv[1]);
/ *
*socket()ϵͳµ÷Ó㬴øÓÐÈý¸ö²ÎÊý£º
*¡¡¡¡¡¡¡¡1¡¢²ÎÊýdomainÖ¸Ã÷ͨÐÅÓò£¬ÈçPF_UNIX(unixÓò)£¬PF_INET(IPv4)£¬
*¡¡¡¡¡¡¡¡¡¡ PF_INET6(IPv6)µÈ
*¡¡¡¡¡¡¡¡2¡¢typeÖ¸Ã÷ͨÐÅÀàÐÍ£¬×î³£ÓõÄÈçSOCK_STREAM(ÃæÏòÁ¬½Ó¿É¿¿·½Ê½£¬
*¡¡¡¡¡¡¡¡¡¡ ±ÈÈçTCP)¡¢SOCK_DGRAM(·ÇÃæÏòÁ¬½ÓµÄ·Ç¿É¿¿·½Ê½£¬±ÈÈçUDP)µÈ¡£
*¡¡¡¡¡¡¡¡3¡¢²ÎÊýprotocolÖ¸¶¨ÐèҪʹÓõÄЭÒé¡£ËäÈ»¿ÉÒÔ¶Ôͬһ¸öЭÒé
*¡¡¡¡¡¡¡¡¡¡ ¼Ò×å(protocol family)(»òÕß˵ͨÐÅÓò(domain))Ö¸¶¨²»Í¬µÄЭÒé
*¡¡¡¡¡¡¡¡¡¡ ²ÎÊý£¬µ«ÊÇͨ³£Ö»ÓÐÒ»¸ö¡£¶ÔÓÚTCP²ÎÊý¿ÉÖ¸¶¨ÎªIPPROTO_TCP,¶ÔÓÚ
*¡¡¡¡¡¡¡¡¡¡ UDP¿ÉÒÔÓÃIPPROTO_UDP¡£Äã²»±ØÏÔʽÖƶ¨Õâ¸ö²ÎÊý£¬Ê¹ÓÃ0Ôò¸ù¾ÝÇ°
*¡¡¡¡¡¡¡¡¡¡ Á½¸ö²ÎÊýʹÓÃĬÈϵÄЭÒé¡£¡¡¡¡
*/
¡¡¡¡serverSocket = socket(PF_INET, SOCK_STREAM,
IPPROTO_TCP);
¡¡¡¡if (-1 == serverSocket)
¡¡¡¡{
¡¡¡¡¡¡¡¡perror("socket()");
¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡}
¡¡
¡¡¡¡/*
¡¡¡¡ * Ò»µ©Ì×½Ó¿Ú±»½¨Á¢£¬ËüµÄÔË×÷»úÖÆ¿ÉÒÔͨ¹ýÌ×½Ó¿ÚÑ¡Ïî(socket option)½øÐÐÐ޸ġ£¡¡¡¡¡¡
¡¡¡¡ */

¡¡¡¡/*
¡¡¡¡ * SO_REUSEADDRÑ¡ÏîµÄÉèÖý«Ì×½Ó¿ÚÉèÖóÉÖØÐÂʹÓþɵĵØÖ·(IPµØÖ·¼Ó¶Ë¿ÚºÅ)¶ø²»µÈ´ý
¡¡¡¡ * ×¢Ò⣺ÔÚLinuxϵͳÖУ¬Èç¹ûÒ»¸ösocket°ó¶¨ÁËij¸ö¶Ë¿Ú£¬¸ÃsocketÕý³£¹Ø±Õ»ò³ÌÐòÍ˳öºó£¬
¡¡¡¡ * ÔÚÒ»¶Îʱ¼äÄڸö˿ÚÒÀÈ»±£³Ö±»°ó¶¨µÄ״̬£¬ÆäËû³ÌÐò(»òÕßÖØÐÂÆô¶¯ µÄÔ­³ÌÐò)ÎÞ·¨°ó¶¨¸Ã¶Ë¿Ú¡£
¡¡¡¡ *
¡¡¡¡ * ÏÂÃæµÄµ÷ÓÃÖУºSOL_SOCKET´ú±í¶ÔSOCKET²ã½øÐвÙ×÷
¡¡¡¡ */
¡¡¡¡on = 1;

¡¡¡¡status = setsockopt(serverSocket, SOL_SOCKET,
SO_REUSEADDR,
¡¡¡¡¡¡¡¡(const char *) &on, sizeof(on));

¡¡¡¡if (-1 == status)
¡¡¡¡{
¡¡¡¡¡¡¡¡perror("setsockopt(...,SO_REUSEADDR,...)");
¡¡¡¡}

¡¡¡¡/* µ±Á¬½ÓÖжÏʱ£¬ÐèÒªÑӳٹرÕ(linger)ÒÔ±£Ö¤ËùÓÐÊý¾Ý¶¼
¡¡¡¡ * ±»´«Ê䣬ËùÒÔÐèÒª´ò¿ªSO_LINGERÕâ¸öÑ¡Ïî
¡¡¡¡ * lingerµÄ½á¹¹ÔÚ/usr/include/linux/socket.hÖж¨Ò壺
¡¡¡¡ *¡¡ struct linger
¡¡¡¡ *¡¡ {
¡¡¡¡ *¡¡¡¡ int l_onoff;¡¡ /* Linger active */
¡¡¡¡ *¡¡¡¡ int l_linger; /* How long to linger */
¡¡¡¡ *¡¡ };

¡¡ *¡¡ Èç¹ûl_onoffΪ0£¬ÔòÑӳٹرÕÌØÐԾͱ»È¡Ïû¡£Èç¹û·ÇÁ㣬ÔòÔÊÐíÌ×½Ó¿ÚÑӳٹرա£
¡¡¡¡ *¡¡ l_linger×Ö¶ÎÔòÖ¸Ã÷ÑӳٹرյÄʱ¼ä
¡¡¡¡ */

¡¡¡¡{
¡¡¡¡¡¡¡¡struct linger linger = { 0 };

¡¡¡¡¡¡¡¡linger.l_onoff = 1;
¡¡¡¡¡¡¡¡linger.l_linger = 30;
¡¡¡¡¡¡¡¡status = setsockopt(serverSocket,
SOL_SOCKET, SO_LINGER,
(const char *) &linger,
sizeof(linger));

¡¡¡¡¡¡¡¡if (-1 == status)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡perror("setsockopt(...,SO_LINGER,...)");
¡¡¡¡¡¡¡¡}
¡¡¡¡}

¡¡¡¡/*
¡¡¡¡ * find out who I am
¡¡¡¡ */

¡¡¡¡status = gethostname(hostname,
sizeof(hostname));
¡¡¡¡if (-1 == status)
¡¡¡¡{
¡¡¡¡¡¡¡¡perror("gethostname()");
¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡}

¡¡¡¡hostPtr = gethostbyname(hostname);
¡¡¡¡if (NULL == hostPtr)
¡¡¡¡{
¡¡¡¡¡¡¡¡perror("gethostbyname()");
¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡}

¡¡¡¡(void) memset(&serverName, 0,
sizeof(serverName));
¡¡¡¡(void) memcpy(&serverName.sin_addr,
hostPtr->h_addr,
hostPtr->h_length);
¡¡¡¡ /*
¡¡¡¡ *h_addrÊÇh_addr_list[0]µÄͬÒå´Ê£¬
¡¡¡¡ *¡¡¡¡h_addr_listÊÇÒ»×éµØÖ·µÄÊý×é
¡¡¡¡ *³¤¶ÈΪ4(byte)´ú±íÒ»¸öIPµØÖ·µÄ³¤¶È
¡¡¡¡ */
/*
* ΪÁËʹ·þÎñÆ÷°ó¶¨±¾»úËùÓеÄIPµØÖ·£¬
* ÉÏÃæÒ»ÐдúÂëÐèÒªÓÃÏÂÃæµÄ´úÂë´úÌæ
* serverName.sin_addr.s_addr=htonl(INADDR_ANY);
*/

¡¡¡¡serverName.sin_family = AF_INET;
¡¡¡¡/* htons:h(host byteorder,Ö÷»ú×Ö½ÚÐò)
¡¡¡¡ *¡¡¡¡¡¡¡¡ to n(network byteorder,ÍøÂç×Ö½ÚÐò
¡¡¡¡ *¡¡¡¡¡¡¡¡ s(shortÀàÐÍ)
¡¡¡¡ */
¡¡¡¡serverName.sin_port = htons(port);
/* ÔÚÒ»¸öµØÖ·(±¾ÀýÖеÄserverSocket)±»½¨Á¢ºó
* Ëü¾ÍÓ¦¸Ã±»°ó¶¨µ½ÎÒÃÇ»ñµÃµÄÌ×½Ó¿Ú¡£
*/
¡¡¡¡status = bind(serverSocket,
(struct sockaddr *) &serverName,
¡¡¡¡¡¡¡¡sizeof(serverName));
¡¡¡¡if (-1 == status)
¡¡¡¡{
¡¡¡¡¡¡¡¡perror("bind()");
¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡}
/* ÏÖÔÚÌ׽ӿھͿÉÒÔ±»ÓÃÀ´¼àÌýеÄÁ¬½Ó¡£
* BACK_LOGÖ¸¶¨ÁËδ¾öÁ¬½Ó¼àÌý¶ÓÁÐ(listen queue for pending connections)
* µÄ×î´ó³¤¶È¡£µ±Ò»¸öеÄÁ¬½Óµ½´ï£¬¶ø¶ÓÁÐÒÑÂúµÄ»°£¬¿Í»§¾Í»áµÃµ½Á¬½Ó¾Ü¾ø´íÎó¡£
* (Õâ¾ÍÊÇdos¾Ü¾ø·þÎñ¹¥»÷µÄ»ù´¡)¡£
*/
¡¡¡¡status = listen(serverSocket, BACK_LOG);
¡¡¡¡if (-1 == status)
¡¡¡¡{
¡¡¡¡¡¡¡¡perror("listen()");
¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡}
/* ´ÓÕâÀ↑ʼ£¬Ì׽ӿھͿªÊ¼×¼±¸½ÓÊÜÇëÇ󣬲¢ÎªËûÃÇ·þÎñ¡£
* ±¾Àý×ÓÊÇÓÃforÑ­»·À´´ïµ½Õâ¸öÄ¿µÄ¡£Ò»µ©Á¬½Ó±»½ÓÊÜ(accpepted)£¬
* ·þÎñÆ÷¿ÉÒÔͨ¹ýÖ¸Õë»ñµÃ¿Í»§µÄµØÖ·ÒÔ±ã½øÐÐһЩÖîÈç¼Ç¼¿Í»§µÇ½֮ÀàµÄ
* ÈÎÎñ¡£
¡¡¡¡for (;;)
¡¡¡¡{
¡¡¡¡¡¡¡¡struct sockaddr_in clientName = { 0 };
¡¡¡¡¡¡¡¡int slaveSocket, clientLength =
sizeof(clientName);

¡¡¡¡¡¡¡¡(void) memset(&clientName, 0,
sizeof(clientName));

¡¡¡¡¡¡¡¡slaveSocket = accept(serverSocket,
(struct sockaddr *) &clientName,
&clientLength);
¡¡¡¡¡¡¡¡if (-1 == slaveSocket)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡perror("accept()");
¡¡¡¡¡¡¡¡¡¡¡¡exit(1);
¡¡¡¡¡¡¡¡}

¡¡¡¡¡¡¡¡childPid = fork();

¡¡¡¡¡¡¡¡switch (childPid)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡case -1: /* ERROR */
¡¡¡¡¡¡¡¡¡¡¡¡perror("fork()");
¡¡¡¡¡¡¡¡¡¡¡¡exit(1);

¡¡¡¡¡¡¡¡case 0: /* child process */

¡¡¡¡¡¡¡¡¡¡¡¡close(serverSocket);

¡¡¡¡¡¡¡¡¡¡¡¡if (-1 == getpeername(slaveSocket,
(struct sockaddr *) &clientName,
&clientLength))
¡¡¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡perror("getpeername()");
¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡¡¡else
¡¡¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡printf("Connection request from %s\n",
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡inet_ntoa(clientName.sin_addr));
¡¡¡¡¡¡¡¡¡¡¡¡}

¡¡¡¡¡¡¡¡¡¡¡¡/*
¡¡¡¡¡¡¡¡¡¡¡¡ * Server application specific code
¡¡¡¡¡¡¡¡¡¡¡¡ * goes here, e.g. perform some
¡¡¡¡¡¡¡¡¡¡¡¡ * action, respond to client etc.
¡¡¡¡¡¡¡¡¡¡¡¡ */
¡¡¡¡¡¡¡¡¡¡¡¡write(slaveSocket, MESSAGE,
¡¡ strlen(MESSAGE));
¡¡¡¡¡¡¡¡¡¡¡¡ /* Ò²¿ÉÒÔʹÓôø»º´æµÄANSIº¯Êýfprint,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ * Ö»ÒªÄã¼ÇµÃ±ØҪʱÓÃfflushˢлº´æ
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ */
¡¡¡¡¡¡¡¡¡¡¡¡close(slaveSocket);
¡¡¡¡¡¡¡¡¡¡¡¡exit(0);

¡¡¡¡¡¡¡¡default: /* parent process */
¡¡¡¡¡¡¡¡¡¡¡¡close(slaveSocket);/* ÕâÊÇÒ»¸ö·Ç³£ºÃµÄÏ°¹ß
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡* ¸¸½ø³Ì¹Ø±Õ×Ó½ø³ÌµÄÌ×½Ó¿ÚÃèÊö·û
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡* ÕýÈçÉÏÃæµÄ×Ó½ø³Ì¹Ø±Õ¸¸½ø³ÌµÄÌ×½Ó¿ÚÃèÊö·û¡£
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡*/¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡}
¡¡¡¡}

¡¡¡¡return 0;
}
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ