简单的时间获取程序-unix网络编程

3 篇文章 0 订阅

客户端程序

#include "unp.h"

int main(int argc,char **argv)
{
    int sockfd,n;
    char recvline[MAXLINE+1];
    /*
     * 网际套接字地址结构
     */
    struct sockaddr_in servaddr;
    if(argc!=2)
        err_quit("usage: <IPaddress>");

    /*
     *socket函数创建一个网际(AF_INET)字节流(SOCK_STREAM)套接字
     * 它是TCP套接字的花哨名字
     * 该函数返回一个小整数描述符,以后的所有函数调用(如随后的connect和read)
     * 就用该描述符来标识这个套接字
     */
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
        /*
         * err_sys函数输出我们作为参数提供的出错消息以及所发生的系统错误的描述
         * (例如出资socket函数的可能错误之一“Protocol not supported”(协议不受支持))
         * 然后终止进程
         */
        err_sys("socket error");
    /*
     * extern void bzero(void *s,int n);
     * @param s 要置0的数据的起始地址
     * @param n 要置0的数据字节个数
     */
    bzero(&servaddr,sizeof(servaddr));
    /*
     * 网际套接字地址族
     * 底层使用哪种通信协议来递交数据的
     * AF_INET 用的是 TCP/IPv4 协议
     */
    servaddr.sin_family=AF_INET;
    /*
     * 网际套接字地址结构中IP地址和端口号这两个成员必须使用特定格式
     * 我们调用库函数 htons ("主机到网络短整数")去转换二进制端口号
     * 调用库函数 inet_pton(“呈现形式到数值”)去把ASCII命令行参数(例如运行本例子所用的206.168.112.96)转换为合适的格式
     */
    servaddr.sin_port=htons(1024);    /*daytime server*/
    /*
     * inet_pton:“点分十进制”->“二进制整数”
     * int inet_pton(int af,const char *src,void *dst);
     * @param af 地址簇
     * @param src 来源地址
     * @param dst 接收转换后的数据
     */
    if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)
        err_quit("inet_pton error for %s",argv[1]);
    /*
     *sockfd套接字与servaddr地址结构指定的服务器建立一个TCP连接
     *
     */
    if(connect(sockfd,(SA*) &servaddr,sizeof(servaddr))<0)
        err_sys("connect error");
    while((n=read(sockfd,recvline,MAXLINE))>0){
        recvline[n]=0;      /*null terminate*/
        if(fputs(recvline,stdout)==EOF)
            err_sys("fputs error");
    }
    if(n<0)
        err_sys("read error");

    exit(0);
}
服务器程序

#include "unp.h"
#include <time.h>

int main(int argc,char **argv)
{
    int listenfd,connfd;
    struct sockaddr_in servaddr;
    char buff[MAXLINE];
    time_t ticks;

    listenfd=Socket(AF_INET,SOCK_STREAM,0);

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(1024);    /*daytime server*/

    Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
    Listen(listenfd,LISTENQ);

    for(;;){
        connfd=Accept(listenfd,(SA*)NULL,NULL);
        ticks=time(NULL);
        snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
        Write(connfd,buff,strlen(buff));

        Close(connfd);
    }
}

相关函数注释摘自wiki

端口改1024是为了新手方便在ide中运行,因为端口号1024之前需要root权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值