LinuxÒÁµéÔ°Ê×Ò³

¿ØÖÆÃæ°å ×ÔÓÉÐÂÎÅ ×ÔÓÉÈí¼þ ×ÔÓÉÎĵµ ×ÔÓÉÂÛ̳ ×ÔÓÉÉÌ³Ç ÁªÏµÎÒÃÇ
ÎÒµÄÊÕ²Ø ÍÆ¼öÎÄÕ »áÔ±µÇ½ ×îºó¸üР¸ß¼¶ËÑË÷ Í˳öµÇ½
ÐÂÎŶ¯Ì¬
ÐÂÊÖÈëÃÅ
¼¼ÊõÇ°ÑØ
ϵͳ¹ÜÀí
ÍøÂç¹ÜÀí
ʹÓþ­Ñé
±à³Ì¿ª·¢
ϵͳ°²È«
½â¾ö·½°¸
Ó²¼þÏà¹Ø
Unix¼Ò×å
Êý¾Ý¿âÀà
¹ÛµãÆÀÂÛ
ÈËÎï½éÉÜ



Linuxeden.com-- Linuxeden ÐÂÎÅ Îĵµ ×ÊÁÏ ½Ì³Ì LinuxÒÁµéÔ° / ±à³Ì¿ª·¢ / LinuxÍøÂç±à³Ì--2. ³õµÈÍøÂ纯Êý½éÉÜ£¨TCP£©
LinuxÍøÂç±à³Ì--2. ³õµÈÍøÂ纯Êý½éÉÜ£¨TCP£©¡¡¡¡ÕÒlinux¹¤×÷,ÕÐlinuxÈ˲Å,µ½LinuxedenÈË²ÅÆµµÀ
2002-10-29    faraway       µã»÷: 16471

http://linuxc.51.net ×÷Õß:hoyt

LinuxϵͳÊÇͨ¹ýÌṩÌ×½Ó×Ö(socket)À´½øÐÐÍøÂç±à³ÌµÄ.ÍøÂç³ÌÐòͨ¹ýsocketºÍÆäËü¼¸¸öº¯ÊýµÄµ÷ÓÃ,»á·µ»ØÒ»¸ö ͨѶµÄÎļþÃèÊö·û,ÎÒÃÇ¿ÉÒÔ½«Õâ¸öÃèÊö·û¿´³ÉÆÕͨµÄÎļþµÄÃèÊö·ûÀ´²Ù×÷,Õâ¾ÍÊÇlinuxµÄÉ豸ÎÞ¹ØÐ﵀ ºÃ´¦.ÎÒÃÇ¿ÉÒÔͨ¹ýÏòÃèÊö·û¶Áд²Ù×÷ʵÏÖÍøÂçÖ®¼äµÄÊý¾Ý½»Á÷.

2.1 socket
int socket(int domain, int type,int protocol)

domain:˵Ã÷ÎÒÃÇÍøÂç³ÌÐòËùÔÚµÄÖ÷»ú²ÉÓõÄͨѶЭ×å(AF_UNIXºÍAF_INETµÈ). AF_UNIXÖ»Äܹ»ÓÃÓÚµ¥Ò»µÄUnixϵͳ½ø³Ì¼äͨÐÅ,¶øAF_INETÊÇÕë¶ÔInternetµÄ,Òò¶ø¿ÉÒÔÔÊÐíÔÚÔ¶³Ì Ö÷»úÖ®¼äͨÐÅ(µ±ÎÒÃÇ man socketʱ·¢ÏÖ domain¿ÉÑ¡ÏîÊÇ PF_*¶ø²»ÊÇAF_*,ÒòΪglibcÊÇposixµÄʵÏÖ ËùÒÔÓÃPF´úÌæÁËAF,²»¹ýÎÒÃǶ¼¿ÉÒÔʹÓõÄ).

type:ÎÒÃÇÍøÂç³ÌÐòËù²ÉÓõÄͨѶЭÒé(SOCK_STREAM,SOCK_DGRAMµÈ) SOCK_STREAM±íÃ÷ÎÒÃÇÓõÄÊÇTCPЭÒé,ÕâÑù»áÌṩ°´Ë³ÐòµÄ,¿É¿¿,Ë«Ïò,ÃæÏòÁ¬½ÓµÄ±ÈÌØÁ÷. SOCK_DGRAM ±íÃ÷ÎÒÃÇÓõÄÊÇUDPЭÒé,ÕâÑùÖ»»áÌṩ¶¨³¤µÄ,²»¿É¿¿,ÎÞÁ¬½ÓµÄͨÐÅ.

protocol:ÓÉÓÚÎÒÃÇÖ¸¶¨ÁËtype,ËùÒÔÕâ¸öµØ·½ÎÒÃÇÒ»°ãÖ»ÒªÓÃ0À´´úÌæ¾Í¿ÉÒÔÁË socketÎªÍøÂçͨѶ×ö»ù±¾µÄ×¼±¸.³É¹¦Ê±·µ»ØÎļþÃèÊö·û,ʧ°Üʱ·µ»Ø-1,¿´errno¿ÉÖªµÀ³ö´íµÄÏêϸÇé¿ö.


2.2 bind
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)

sockfd:ÊÇÓÉsocketµ÷Ó÷µ»ØµÄÎļþÃèÊö·û.

addrlen:ÊÇsockaddr½á¹¹µÄ³¤¶È.

my_addr:ÊÇÒ»¸öÖ¸ÏòsockaddrµÄÖ¸Õë. ÔÚÖÐÓÐ sockaddrµÄ¶¨Òå

struct sockaddr{
unisgned short as_family;
char sa_data[14];
};

²»¹ýÓÉÓÚϵͳµÄ¼æÈÝÐÔ,ÎÒÃÇÒ»°ã²»ÓÃÕâ¸öÍ·Îļþ,¶øÊ¹ÓÃÁíÍâÒ»¸ö½á¹¹(struct sockaddr_in) À´´úÌæ.ÔÚÖÐÓÐsockaddr_inµÄ¶¨Òå
struct sockaddr_in{
unsigned short sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];

ÎÒÃÇÖ÷ҪʹÓÃInternetËùÒÔsin_familyÒ»°ãΪAF_INET,sin_addrÉèÖÃΪINADDR_ANY±íʾ¿ÉÒÔ ºÍÈκεÄÖ÷»úͨÐÅ,sin_portÊÇÎÒÃÇÒª¼àÌýµÄ¶Ë¿ÚºÅ.sin_zero[8]ÊÇÓÃÀ´Ìî³äµÄ. bind½«±¾µØµÄ¶Ë¿Úͬsocket·µ»ØµÄÎļþÃèÊö·ûÀ¦°óÔÚÒ»Æð.³É¹¦ÊÇ·µ»Ø0,ʧ°ÜµÄÇé¿öºÍsocketÒ»Ñù

2.3 listen
int listen(int sockfd,int backlog)

sockfd:ÊÇbindºóµÄÎļþÃèÊö·û.

backlog:ÉèÖÃÇëÇóÅŶӵÄ×î´ó³¤¶È.µ±Óжà¸ö¿Í»§¶Ë³ÌÐòºÍ·þÎñ¶ËÏàÁ¬Ê±, ʹÓÃÕâ¸ö±íʾ¿ÉÒÔ½éÉܵÄÅŶӳ¤¶È. listenº¯Êý½«bindµÄÎļþÃèÊö·û±äΪ¼àÌýÌ×½Ó×Ö.·µ»ØµÄÇé¿öºÍbindÒ»Ñù.


2.4 accept
int accept(int sockfd, struct sockaddr *addr,int *addrlen)

sockfd:ÊÇlistenºóµÄÎļþÃèÊö·û.

addr,addrlenÊÇÓÃÀ´¸ø¿Í»§¶ËµÄ³ÌÐòÌîдµÄ,·þÎñÆ÷¶ËÖ»Òª´«µÝÖ¸Õë¾Í¿ÉÒÔÁË. bind,listenºÍacceptÊÇ·þÎñÆ÷¶ËÓõĺ¯Êý,acceptµ÷ÓÃʱ,·þÎñÆ÷¶ËµÄ³ÌÐò»áÒ»Ö±×èÈûµ½ÓÐÒ»¸ö ¿Í»§³ÌÐò·¢³öÁËÁ¬½Ó. accept³É¹¦Ê±·µ»Ø×îºóµÄ·þÎñÆ÷¶ËµÄÎļþÃèÊö·û,Õâ¸öʱºò·þÎñÆ÷¶Ë¿ÉÒÔÏò¸ÃÃèÊö·ûдÐÅÏ¢ÁË. ʧ°Üʱ·µ»Ø-1


2.5 connect
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)

sockfd:socket·µ»ØµÄÎļþÃèÊö·û.

serv_addr:´¢´æÁË·þÎñÆ÷¶ËµÄÁ¬½ÓÐÅÏ¢.ÆäÖÐsin_addÊÇ·þÎñ¶ËµÄµØÖ·

addrlen:serv_addrµÄ³¤¶È

connectº¯ÊýÊǿͻ§¶ËÓÃÀ´Í¬·þÎñ¶ËÁ¬½ÓµÄ.³É¹¦Ê±·µ»Ø0,sockfdÊÇͬ·þÎñ¶ËͨѶµÄÎļþÃèÊö·û ʧ°Üʱ·µ»Ø-1.


2.6 ʵÀý

·þÎñÆ÷¶Ë³ÌÐò


/******* ·þÎñÆ÷³ÌÐò (server.c) ************/
#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char *argv[])
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
char hello[]="Hello! Are You Fine?\n";

if(argc!=2)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}

if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}

/* ·þÎñÆ÷¶Ë¿ªÊ¼½¨Á¢socketÃèÊö·û */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}

/* ·þÎñÆ÷¶ËÌî³ä sockaddr½á¹¹ */
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);

/* À¦°ósockfdÃèÊö·û */
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}

/* ¼àÌýsockfdÃèÊö·û */
if(listen(sockfd,5)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}

while(1)
{
/* ·þÎñÆ÷×èÈû,Ö±µ½¿Í»§³ÌÐò½¨Á¢Á¬½Ó */
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}

fprintf(stderr,"Server get connection from %s\n",
inet_ntoa(client_addr.sin_addr));
if(write(new_fd,hello,strlen(hello))==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
/* Õâ¸öͨѶÒѾ­½áÊø */
close(new_fd);
/* Ñ­»·ÏÂÒ»¸ö */
}
close(sockfd);
exit(0);
}


¿Í»§¶Ë³ÌÐò

/******* ¿Í»§¶Ë³ÌÐò client.c ************/
#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;

if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}

if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}

if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}

/* ¿Í»§³ÌÐò¿ªÊ¼½¨Á¢ sockfdÃèÊö·û */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}

/* ¿Í»§³ÌÐòÌî³ä·þÎñ¶ËµÄ×ÊÁÏ */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);

/* ¿Í»§³ÌÐò·¢ÆðÁ¬½ÓÇëÇó */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}

/* Á¬½Ó³É¹¦ÁË */
if((nbytes=read(sockfd,buffer,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("I have received:%s\n",buffer);
/* ½áÊøÍ¨Ñ¶ */
close(sockfd);
exit(0);
}


MakeFile
ÕâÀïÎÒÃÇʹÓÃGNU µÄmakeʵÓóÌÐòÀ´±àÒë. ¹ØÓÚmakeµÄÏêϸ˵Ã÷¼û Make ʹÓýéÉÜ

######### Makefile ###########
all:server client
server:server.c
gcc $^ -o $@
client:client.c
gcc $^ -o $@

ÔËÐÐmakeºó»á²úÉúÁ½¸ö³ÌÐòserver(·þÎñÆ÷¶Ë)ºÍclient(¿Í»§¶Ë) ÏÈÔËÐÐ./server portnumber& (portnumberËæ±ãȡһ¸ö´óÓÚ1204ÇÒ²»ÔÚ/etc/servicesÖгöÏֵĺÅÂë ¾ÍÓÃ8888ºÃÁË),È»ºóÔËÐÐ ./client localhost 8888 ¿´¿´ÓÐʲô½á¹û. (ÄãÒ²¿ÉÒÔÓÃtelnetºÍnetstatÊÔÒ»ÊÔ.) ÉÏÃæÊÇÒ»¸ö×î¼òµ¥µÄÍøÂç³ÌÐò,²»¹ýÊDz»ÊÇÒ²Óе㷳.ÉÏÃæÓÐÐí¶àº¯ÊýÎÒÃÇ»¹Ã»ÓнâÊÍ. ÎÒ»áÔÚÏÂÒ»Õ½øÐеÄÏêϸµÄ˵Ã÷.


2.7 ×ܽá
×ܵÄÀ´ËµÍøÂç³ÌÐòÊÇÓÉÁ½¸ö²¿·Ö×é³ÉµÄ--¿Í»§¶ËºÍ·þÎñÆ÷¶Ë.ËüÃǵĽ¨Á¢²½ÖèÒ»°ãÊÇ:

·þÎñÆ÷¶Ë
socket-->bind-->listen-->accept

¿Í»§¶Ë
socket-->connect


ÔðÈα༭: faraway
·¢±íÆÀÂÛ ²é¿´ÆÀÂÛ ¼ÓÈëÊÕ²Ø Email¸øÅóÓÑ ´òÓ¡±¾ÎÄ
Èç¹ûÄãÏë¶Ô¸ÃÎÄÕÂÆÀ·Ö, ÇëÏȵǽ, Èç¹ûÄãÈÔδע²á,Çëµã»÷×¢²áÁ´½Ó×¢²á³ÉΪ±¾Õ¾»áÔ±.
ƽ¾ùµÃ·Ö 0, ¹² 0 ÈËÆÀ·Ö
1 2 3 4 5 6 7 8 9 10
Copyright © 2002 -2003 Linuxeden.com-- Linuxeden ÐÂÎÅ Îĵµ ×ÊÁÏ ½Ì³Ì LinuxÒÁµéÔ°
All rights reserved.