在ping源码代阅读(一)中,图片详细表述了服务器端和客户端的交互过程,在这里以代码的形式分析其过程.
服务器端:
bind到一个端口后,使用listen开始收听所有的请求,这里在内核创建了一个长度为10的队列,一有请求就会放入到队尾.accept从队头取出一个请求开始处理.然后向此请求写入数据.
s = socket(PF_INET,SOCK_STREAM,0);
memset(&adr_srvr,0,sizeof adr_srvr);
adr_srvr.sin_family = AF_INET;
adr_srvr.sin_port = htons(atoi(srvr_port));
if ( strcmp(srvr_addr,"*") != 0 ) {
adr_srvr.sin_addr.s_addr =
inet_addr(srvr_addr);
} else {
adr_srvr.sin_addr.s_addr =
INADDR_ANY;
}
len_inet = sizeof adr_srvr;
z = bind(s,(struct sockaddr *)&adr_srvr,
len_inet);
z = listen(s,10);
for (;;) {
len_inet = sizeof adr_clnt;
c = accept(s,
(struct sockaddr *)&adr_clnt,
&len_inet);
for (i = 0; i < 6; i++){
time(&td);
n = (int) strftime(dtbuf,sizeof dtbuf,
"%A %b %d %H:%M:%S %Y\n",
localtime(&td));
z = write(c,dtbuf,n);
}
close(c);
}
客户端:
客户端连接到这个服务端口,最后这个请求将被执行,写回数据,在这里用read把传回的数据读出来,read每次只读了128的字节,所以这里需不断重复读.直到数据长度为0时终止.
s = socket(PF_INET,SOCK_STREAM,0);
memset(&adr_srvr,0,sizeof adr_srvr);
adr_srvr.sin_family = AF_INET;
adr_srvr.sin_port = htons(atoi(srvr_port));
adr_srvr.sin_addr.s_addr =
inet_addr(srvr_addr);
len_inet = sizeof adr_srvr;
z = connect(s,&adr_srvr,len_inet);
while(1){
z = read(s,&dtbuf,sizeof dtbuf-1);
dtbuf[z] = 0; /* NUL terminate string */
printf("Date & Time is: %s\n",dtbuf);}
close(s);
如果知道这个过程如何完成之后,看图会更加形像.