ping源码代阅读(三)面向连接tcp/ip程序

来源:互联网 发布:知乎live付费 编辑:程序博客网 时间:2024/04/29 10:56

在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);

如果知道这个过程如何完成之后,看图会更加形像.

原创粉丝点击