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

时间:2023-03-09 02:12:54
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!\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