zoukankan      html  css  js  c++  java
  • Linux网络编程(简单的时间获取服务器)

    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("服务器开启中
    ");
        /*创建套接字*/
        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
    ",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
    ",buf);
            memset(buf,0,strlen(buf));
    
        }
        close(fd);
        return 0;
    }
  • 相关阅读:
    Exaple2_1(显示转换)
    Example2_4(数据的输入Scanner)
    安装jdk遇到的问题
    Java应用程序,用户从键盘只能输入整数,程序输出这些整数的乘积
    Hello.Java//Tom and Jerry
    Example2_3(数据输出System.out.printf)
    Example2_2(基本类型转换)
    c++与java的区别
    大龄屌丝自学笔记Java零基础到菜鸟004
    大龄屌丝自学笔记Java零基础到菜鸟003
  • 原文地址:https://www.cnblogs.com/yasanlun/p/3856438.html
Copyright © 2011-2022 走看看