zoukankan      html  css  js  c++  java
  • Linux之网络编程:时间服务器

    基于TCP-服务器

    1,创建一个socket套接字

    int socket(int domain,int type,int protocol)

    domain:IP地址族,AF_INET(IPv4)、AF_INET6(IPv6)、AF_LOCAL/AF_UNIX(本地)

    type:套接字,流式套接字(SOCK_STRAM),数字报套接字(SOCK_DGRAM),原始套接字(SOCK_RAM)

    protocol:置0

    2,邦定socket套接字和服务器相关资料

    int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

    sockfd:套接字描述符

    addr:指向服务器sockaddr的指针

    addrlen:参数addr的长度

    成功为0,失败非0

    3,设置允许客户端的最大连接数

    int listen(int sockfd,int backlog)

    backlog:连接数量

    4、用来等待客户端的连接请求

    int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)

    addr:指向客户端的sockaddr的指针

    addrlen:参数addr的长度

    例如:

    服务器端time_server.c

    复制代码
     1 /*************************************************************************
     2     > File Name: sock_server.c
     3     > Author: xu
     4     > Mail: eeexu123@163.com 
     5     > Created Time: 2016年10月13日 星期四 16时13分24秒
     6  ************************************************************************/
     7 
     8 #include<stdio.h>
     9 #include<sys/types.h>
    10 #include<sys/socket.h>
    11 #include<string.h>
    12 #include <netinet/in.h>
    13 #include <arpa/inet.h>
    14 #include<unistd.h>
    15 #include<time.h>
    16 #include<stdlib.h>
    17 #define MAX_LISTEN_QUE 5
    18 #define BUFFER_SIZE 128
    19 
    20 int main(int argc,char *argv[])
    21 {
    22     int sockfd,listenfd;
    23     int bytes,opt=1;
    24     time_t timp;
    25     char buf[BUFFER_SIZE];
    26     struct sockaddr_in server,client;
    27     /*客户端程序开始建立sockfd描述符*/
    28     listenfd = socket(AF_INET,SOCK_STREAM,0);
    29     if(listenfd < 0)
    30     {
    31         perror("socket");
    32         exit(1);
    33     }
    34     /*使用套接字选项,避免出错*/
    35     if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) != 0)
    36     {
    37         perror("setsockopt");
    38         exit(1);
    39     }
    40     /*服务器填充sockaddr结构*/
    41     bzero(&server,sizeof(server));    //对结构体清零
    42     server.sin_family = AF_INET;    //IPv4地址族
    43     server.sin_addr.s_addr = ntohl(INADDR_ANY);    //服务器IP址址
    44     server.sin_port = ntohs(8888);    //端口号
    45     
    46     /*邦定sockfd描述符到IP地址*/
    47     int len = sizeof(struct sockaddr);
    48     if(bind(listenfd,(struct sockaddr *)&server,len) != 0)
    49     {
    50         perror("bind");
    51         exit(1);
    52     }
    53     
    54     /*设置允许连接的最大客户数*/
    55     if(listen(listenfd,MAX_LISTEN_QUE) != 0)
    56     {
    57         perror("listen");
    58         exit(1);
    59     }
    60     while(1)
    61     {
    62         /*服务器阻塞,直到客户程序建立连接*/
    63         sockfd = accept(listenfd,(struct sockaddr *)&client,&len);
    64         if(sockfd < 0)
    65         {
    66             perror("accept");
    67             exit(1);
    68         }
    69         //提取时间
    70         timp = time(NULL);
    71         snprintf(buf,BUFFER_SIZE,"%s",ctime(&timp));
    72         //向客户端发送时间
    73         bytes = write(sockfd,buf,strlen(buf));
    74         if(bytes < 0)
    75         {
    76             perror("write");
    77             exit(1);
    78         }
    79         
    80         printf("buf is %s and buf size %d
    ",buf,bytes);
    81         printf("IP:0X%x,PORT:%d
    ",htonl(client.sin_addr.s_addr),htons(client.sin_port));
    82         //结束本次连接
    83         close(sockfd);
    84     }
    85     close(listenfd);
    86     return 0;
    87 }
    复制代码

    客户端time_client.c

    复制代码
     1 /*************************************************************************
     2     > File Name: sock_client.c
     3     > Author: xu
     4     > Mail: eeexu123@163.com 
     5     > Created Time: 2016年10月13日 星期四 16时13分37秒
     6  ************************************************************************/
     7 
     8 #include<stdio.h>
     9 #include<sys/types.h>
    10 #include<sys/socket.h>
    11 #include<string.h>
    12 #include <netinet/in.h>
    13 #include <arpa/inet.h>
    14 #include<unistd.h>
    15 #include<netdb.h>
    16 #include<time.h>
    17 #include<stdlib.h>
    18 #define MAX_LISTEN_QUE 5
    19 #define BUFFER_SIZE 128
    20 
    21 int main(int argc,char *argv[])
    22 {
    23     int sockfd,bytes;
    24     int buf[BUFFER_SIZE];
    25     struct sockaddr_in server;
    26 
    27 
    28     /*客户端程序开始建立sockfd描述符*/
    29     sockfd = socket(AF_INET,SOCK_STREAM,0);
    30     if(sockfd < 0)
    31     {
    32         perror("socket");
    33         exit(1);
    34     }
    35     /*客户端程序填充服务端资料*/
    36     bzero(&server,sizeof(server));    //初始化,置0
    37     server.sin_family = AF_INET;    //IPv4
    38     server.sin_addr.s_addr = inet_addr("127.0.0.1");    //IP址址
    39     server.sin_port = htons(8888);        
    40     /*客户端程序发起连接请求*/
    41     if(connect(sockfd,(struct sockaddr *)&server,sizeof(server)) < 0)
    42     {
    43         perror("connetc");
    44         exit(1);
    45     }
    46     /*读取服务端时间*/
    47     bytes = read(sockfd,buf,BUFFER_SIZE);
    48     if(bytes < 0)
    49     {
    50         perror("read");
    51         exit(1);
    52     }
    53     if(0 == bytes)
    54     {
    55         printf("server close
    ");
    56         exit(1);
    57     }
    58     printf("read bytes is :%d
    ",bytes);
    59     printf("Time is :%s
    ",buf);
    60     
    61     close(sockfd);
    62     return 0;
    63 }
    复制代码
    如果有错误,欢迎各位网友指导。 另外喜欢的话,给个推荐呗,谢谢!
  • 相关阅读:
    【codevs1690】开关灯 (线段树 区间修改+区间求和 (标记))
    【codevs1191】数轴染色 (线段树 区间修改+固定区间查询)
    【机器学习】李航 统计学习方法 知识点总结
    【机器学习】生成模型 判别模型
    【机器学习】贝叶斯定理、精准推断、最大似然估计、连续特征参数估计、EM算法
    python queue 讲解
    【tensorflow】 CNN卷积神经网络原理讲解+图片识别应用(附源码)
    URL解析过程
    Python 可迭代对象迭代器生成器的区别
    【Linux】 修改主机名
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/10339933.html
Copyright © 2011-2022 走看看