zoukankan      html  css  js  c++  java
  • Socket入门-获取服务器时间实例

    daytimetcpsrv.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <time.h>
    
    int main(int argc,char **argv)
    {
        int listenfd,connfd;//监听套接字,连接套接字
        struct sockaddr_in servaddr;
        char buff[1024];
        time_t ticks;
        
        //创建监听套接字
        listenfd=socket(AF_INET,SOCK_STREAM,0);
        
        // 填写网际套接字地址
            //bzero相对于memset 更加好记,只有两个参数。 Berkeley函数和ANSI C标准函数
        bzero(&servaddr,sizeof(servaddr));//清空结构推荐使用memset函数,bzero函数已过时,速度慢
        servaddr.sin_family=AF_INET;//协议
            //htonl htons 字节排序函数
        servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//任意主机网络接口中连接服务器
        servaddr.sin_port=htons(10000);//绑定端口
        
        //绑定套接字
        bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
    
        //Listen 函数把该套接字转换成监听套接字
        listen(listenfd,10);
    
        //等待连接
        printf("Waiting connection!
    ");
    
        for(;;)
        {    
            //阻塞,投入睡眠,等待某个客户连接的到达并被内核接受。TCP使用三次握手建立连接,握手完毕时accept返回,只时一个已连接描述符
            connfd=accept(listenfd,(struct sockaddr *)NULL,NULL);
            ticks=time(NULL);
            snprintf(buff,sizeof(buff),"%.24s
    ",ctime(&ticks));//ctime把整数值转换成直观可读的时间格式
            //写到buff缓冲区,并不等于已经发送给对方,等缓冲区处理完之前的数据后,开始传送缓冲区内容
            write(connfd,buff,strlen(buff));
            close(connfd);
        }
    }
    //补充知识:
    //------------------------
    //字节操纵函数  <strings.h>
    //Berkeley函数
    //bzero bcopy bcmp ---以上仅仅列出函数名
    //ANSI C 函数
    //*memset *memcpy memcmp
    //------------------------
    

      daytimetcpcli.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    int main(int argc,char **argv)
    {
        int sockfd,n;
        char recvline[1024];
        struct sockaddr_in servaddr;
    
        if(argc!=2)
            {printf("参数有误!
    ");return -1;}
    
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
            {printf("套接字创建失败!
    ");return -1;}
    
        //指定服务器的IP地址和端口
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family=AF_INET;//协议
        servaddr.sin_port =htons(10000);//端口
            //inet_pton地址转换(ASCII 字符串 与 网络字节序的二进制之间转换网际地址) P表达->N数值
        if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//IP地址有参数获得argv[1],argv[0]->当前程序
            {printf("inet_pton error for ");return -1;}
        
        //进行连接到服务器
        if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
            {printf("connect error");return -1;}
    
        //读数据
        while( (n=read(sockfd,recvline,1024))>0){
            recvline[n]=0;
            if(fputs(recvline,stdout)==EOF)//将recvline中的数据输出到标准输出
                {printf("fputs error");return -1;}
        }
    
        if(n<0)printf("read error");
    
        exit(0);        
    }
    

      
    输出结果:
    服务器端:
    xx@xxxxxx:~/Public/C$ ./daytimetcpsrv.out 
    Waiting connection!

    客户机端:
    xx@xxxxxx:~/Public/C$ ./daytimetcpcli.out 127.0.0.1
    Sat Jun  4 09:28:33 2016

  • 相关阅读:
    PAT1038
    PAT1034
    PAT1033
    PAT1021
    PAT1030
    PAT1026
    PAT1063
    PAT1064
    PAT1053
    PAT1025
  • 原文地址:https://www.cnblogs.com/A--Q/p/5665146.html
Copyright © 2011-2022 走看看