码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2014-07-21 08:39:51      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   os   io   

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;
}

Linux网络编程(简单的时间获取服务器),布布扣,bubuko.com

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

标签:style   blog   color   使用   os   io   

原文地址:http://www.cnblogs.com/yasanlun/p/3856438.html

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