电子产品世界 » 论坛首页 » 企业专区 » STM32 » Linux之网络编程:时间服务器


共2条 1/1 1 跳转至

Linux之网络编程:时间服务器

工程师
2018-04-09 12:03:23    评分

基于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 12819 
 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\n",buf,bytes);
81         printf("IP:0X%x,PORT:%d\n",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\n");
 56         exit(1);
 57     }
 58     printf("read bytes is :%d\n",bytes);
 59     printf("Time is :%s\n",buf);
 60     
 61     close(sockfd);
 62     return 0;
 63 }
复制代码

 




菜鸟
2018-04-13 16:06:42    评分
2楼

学习一下


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]