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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值