Linux网络编程(简单的时间获取服务器)

时间:2021-10-06 00:51:48

1.一个简单的服务器时间获取程序

   服务器和客户端采用UDP通信的方式,来编写一个简单的时间获取应用.

   把过程大致理顺一下,首先是服务器端的编写,使用的是迭代的方式,没有并发

   先创建一个socket而后bind服务器,绑定之后就可以创建一个循环来接收和发送

   信息了,以达到和客户端之间的通信.

#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<time.h>
#include
<sys/socket.h>
#include
<sys/types.h>
#include
<unistd.h>
#include
<netinet/in.h>
int main(int argc,char** argv)
{
printf(
"服务器开启中\n");
/*创建套接字*/
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == fd)
{
perror(
"socket");
exit(
-1);
}
/*准备通信地址*/
struct sockaddr_in addr;
addr.sin_family
= AF_INET;
addr.sin_port
= htons(2222);
addr.sin_addr.s_addr
= inet_addr("172.16.1.21");
/*防止端口被占用*/
int reuse = 1;
setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,
&reuse,sizeof(reuse));
/*绑定网络端口和ip地址*/
if(bind(fd,(struct sockaddr*)&addr,sizeof(addr)) == -1)
{
perror(
"bind");
exit(
-1);
}
while(1)
{
/*发送和接收消息*/
char buf[100] = {};
struct sockaddr_in from;
/*创建一个当前的时间*/
time_t now
= time(0);
struct tm* time = localtime(&now);
socklen_t f_size
= sizeof(from);
recvfrom(fd,buf,
sizeof(buf),0,(struct sockaddr*)&from,&f_size);
printf(
"%s\n",buf);
memset(buf,
0,sizeof(buf));
char str[50] = {};
sprintf(str,
"%04d-%02d-%02d %02d:%02d:%02d",time->tm_year+1900,
time
->tm_mon+1,time->tm_mday,time->tm_hour,
time
->tm_min,time->tm_sec);
strcpy(buf,str);
sendto(fd,buf,
sizeof(buf),0,(struct sockaddr*)&from,sizeof(from));
memset(buf,
0,strlen(buf));
memset(str,
0,strlen(str));
}
}

客户端的编写,因为是UDP通信,并没有用到connect连接.而sendto和recvfrom函数可以保存发送和接收的套接字地址

所以客户端只要创建一个迭代循环,每次输入一个就可以得到服务器的时间.

#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<time.h>
#include
<sys/socket.h>
#include
<sys/types.h>
#include
<unistd.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
int main(void)
{
/*准备套接字*/
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == fd)
{
perror(
"socket");
exit(
-1);
}
/*准备通信地址*/
struct sockaddr_in addr;
addr.sin_family
= AF_INET;
addr.sin_port
= htons(2222);
addr.sin_addr.s_addr
= inet_addr("172.16.1.21");
/*连接服务器的时候用sendto和UDP通信的时候可以不连接,直接发*/
while(1)
{
char buf[50] = {};
struct sockaddr_in from;
socklen_t f_size
= sizeof(from);
scanf(
"%s",buf);
if(-1 == sendto(fd,buf,strlen(buf),0,(struct sockaddr*)&addr,f_size))
{
perror(
"sendto");
exit(
-1);
}
memset(buf,
0,strlen(buf));
if(-1 == recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&from,&f_size))
{
perror(
"recvfrom");
exit(
-1);
}
printf(
"%s\n",buf);
memset(buf,
0,strlen(buf));

}
close(fd);
return 0;
}