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学时 [实验内容] 实现一个服务器 ...
随机推荐
- Java03动手动脑
1.当JAVA里定义的函数中去掉static后,怎么办? static代表静态,由于main函数是静态的,如果自己定义的函数方法加了static则在类加载时就一起加载了.但如果不写static,就必须 ...
- Redis闪退解决办法
复杂办法! cmd 进入命令,cd进入redis文件 输入:redis-server.exe redis.windows.conf,手动开启! 简单办法,删除重新下载! 不确定办法如下 1.在解压的r ...
- Python 获取计算机全名(fully qualified host name)
Python 获取计算机全名(fully qualified host name) import socket socket.getfqdn() socket.gethostname()
- Snowflake Snow Snowflakes POJ - 3349(hash)
You may have heard that no two snowflakes are alike. Your task is to write a program to determine wh ...
- XML相关的安全漏洞-XXE,XPATH小结
0x00前言: 本文主要小结以下php下的xpath查询xml结构的漏洞利用和XXE漏洞利用 xml是可扩展标记语言,它被设计出来是为了存储传输数据的. 它的结构是树形结构,并且标签要成对出现比如下面 ...
- SpringBoot使用Mybatis-Generator
本文介绍如何将Maven和Mybatis-Generator配合使用. 简介 Mybatis-Generator是Mybatis提供的一个便捷型插件,自动可以为项目生产对应的实体类,Mapper,da ...
- MySQL 查询所有的表名
select table_name from information_schema.tables where table_schema='laiu8' and table_type='base tab ...
- vue中的页面渲染方案
一.模板渲染 <div id="J_render_app"> <ul v-if="items.length"> <li v-for ...
- UVA 277 Puzzle
题意:输入5x5的字符串,输入操作,要求输出完成操作后的字符串. 注意:①输入的操作执行可能会越界,如果越界则按题目要求输出不能完成的语句. ②除了最后一次的输出外,其他输出均要在后面空一行. ③操作 ...
- jquery中,使用append增加新元素时,新增元素的绑定监听事件失效的解决办法
$("outerSelector").on("eventType","innerSelector",function(){}); 举例:如果 ...