码迷,mamicode.com
首页 > 其他好文 > 详细

Socket入门-获取服务器时间实例

时间:2016-07-12 23:31:11      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

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!\n");

    for(;;)
    {    
        //阻塞,投入睡眠,等待某个客户连接的到达并被内核接受。TCP使用三次握手建立连接,握手完毕时accept返回,只时一个已连接描述符
        connfd=accept(listenfd,(struct sockaddr *)NULL,NULL);
        ticks=time(NULL);
        snprintf(buff,sizeof(buff),"%.24s\r\n",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("参数有误!\n");return -1;}

    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
        {printf("套接字创建失败!\n");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

Socket入门-获取服务器时间实例

标签:

原文地址:http://www.cnblogs.com/A--Q/p/5665146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!