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

Linux之网络编程:时间服务器的更多相关文章
- 嵌入式linux的网络编程(1)--TCP/IP协议概述
嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...
- Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...
- Linux C网络编程学习笔记
Linux C网络编程总结报告 一.Linux C 网络编程知识介绍: 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端:(client) 在网络程序中, ...
- UNIX网络编程——客户/服务器程序设计示范(总结)
(1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了.这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收.我们的其他意见是就重负荷运 ...
- 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)
RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- Linux网络编程客户\服务器设计范式
1.前言 网络编程分为客户端和服务端,服务器通常分为迭代服务器和并发服务器.并发服务器可以根据多进程或多线程进行细分,给每个连接创建一个独立的进程或线程,或者预先分配好多个进程或线程等待连接的请求.今 ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- LINUX socket网络编程
1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 U ...
- 【Linux/unix网络编程】之使用socket进行TCP编程
实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...
随机推荐
- Flink--Split和select
Split就是将一个DataStream分成两个或者多个DataStream Select就是获取分流后对应的数据 val env = StreamExecutionEnvironment.getEx ...
- OSPF协议之详细图解
OSPF是一种基于SPF算法的链路状态路由协议. 上图是在一个OSPF区域里面添入一台新的路由器的时候,OSPF协议的工作过程,如果你能非常详细的叙述出这张图的话,基本上OSPF协议的工作过程你就掌握 ...
- Codeforces 989D A Shade of Moonlight
A Shade of Moonlight 列列式子发现, 对于同一个云来说只有反向的云才能和它相交, 然后我们发现这个东西有单调性,然后二分就好啦. #include<bits/stdc++.h ...
- sql 表值函数-将一个传入的字符串用2中分隔符拆分成临时表
USE [tms]GO/****** Object: UserDefinedFunction [dbo].[fn_StrToTable_Double] Script Date: 2017/4/26 9 ...
- Python多重继承顺序---C3算法
什么是多重继承C3算法 MRO即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类). 在python2.2版本中,算法基本思想是根据每 ...
- Elasticsearch 基于 URL 的搜索请求
背景 Elasticsearch 不像关系型数据库,没有简易的 SQL 用来查询数据,只能通过调用 RESTful API 实现查询.大体上查询分为两种,基于 URL 的和基于请求主体的.基于 URL ...
- Linux 默认目录
/etc 存放系统管理所需要的配置文件和子目录 /home 一般用户的主目录 /usr 用户使用的系统目录和应用程序等信息 /bin 存放使用者经常使用的命令 如cp ls cat 等 /proc ...
- React + antd 组件离开页面以后出现Can only update a mounted or mounting component 的解决办法
做项目的过程中,来回切换页面时,一直遇到Can only update a mounted or mounting component 这个问题,原因是当离开页面以后,组件已经被卸载,执行setSta ...
- BZOJ.4513.[SDOI2016]储能表(数位DP)
BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...
- php xml格式对象 返回->对应格式数组
/* * $objXml xml格式对象 * 返回 : 对应格式数组 */ public function XmlString2Arr($xml) { ...