linux网络编程框架
OSI七层模型与TCP四层模型

OSI七层模型与TCP四层模型
BS和CS服务器架构
(1)CS架构介绍(client server,客户端服务器架构)
(2)BS架构介绍(broswer server,浏览器服务器架构)
TCP协议
(1)建立连接需要三次握手
(2)建立连接的条件:服务器listen时客户端主动发起connect
(3)关闭连接需要四次握手
(4)服务器或者客户端都可以主动发起关闭
注:这些握手协议已经封装在TCP协议内部,socket编程接口平时不用管

TCP如何保证可靠传输
(1)TCP在传输有效信息前要求通信双方必须先握手,建立连接才能通信
(2)TCP的接收方收到数据包后会ack给发送方,若发送方未收到ack会丢包重传
(3)TCP的有效数据内容会附带校验,以防止内容在传递过程中损坏
(4)TCP会根据网络带宽来自动调节适配速率(滑动窗口技术)
(5)发送方会给各分割报文编号,接收方会校验编号,一旦顺序错误即会重传。
基于socket编程
1、建立连接
(1)socket。socket函数类似于open,用来打开一个网络连接,如果成功则返回一个网络文件描述符(int类型),之后我们操作这个网络连接都通过这个网络文件描述符。
(2)bind
(3)listen
(4)connect
2、发送和接收
(1)send和write
(2)recv和read
3、辅助性函数
(1)inet_aton、inet_addr、inet_ntoa
(2)inet_ntop、inet_pton
4、表示IP地址相关数据结构
(1)都定义在 netinet/in.h
(2)struct sockaddr,这个结构体是网络编程接口中用来表示一个IP地址的,注意这个IP地址是不区分IPv4和IPv6的(或者说是兼容IPv4和IPv6的)
(3)typedef uint32_t in_addr_t; 网络内部用来表示IP地址的类型
(4)
struct in_addr
{
in_addr_t s_addr;
};
()struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
(6)struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。在实际编程中这个结构体会被一个struct sockaddr_in或者一个struct sockaddr_in6所填充。

客户端流程

服务器流程
htons函数为将主机序转为网络序
网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。(大端模式) 主机字节顺序(HBO,Host Byte Order): 不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。
客户端与服务器代码
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <arpa/inet.h>
#include <string.h> #define SERVER_IP "192.168.149.137"
#define SERVER_PORT 5005
#define BACKLOG 100
#define DEBUF(X) printf(X) typedef struct commu
{
char name[];
int age;
}info; int main()
{
int sock_fd = -;//socket 描述符
int server_fd = -;//连接描述符
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;//客户地址
socklen_t len = ;//接收长度
int ret = -;
char send_buf[];
char recv_buf[];
//1,打开socket
sock_fd = socket(AF_INET,SOCK_STREAM,);
if(- == sock_fd)
{
perror("socket");
return -;
}
printf("sock_fd = %d.\n",sock_fd);
//2、connect 连接服务器
server_addr.sin_family = AF_INET;//IPV4
server_addr.sin_port = htons(SERVER_PORT);//设置端口模式
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);//设置IP
ret = connect(sock_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(- == ret)
{
perror("connect");
return -;
}
DEBUF("成功简历连接\n");
info st1;
while()
{
printf("请输入学生姓名\n");
scanf("%s",st1.name);
printf("请输入学生年龄\n");
scanf("%d",&st1.age);
//1.发送
ret = send(sock_fd,&st1,sizeof(info),);
memset(send_buf,,strlen(send_buf));
printf("发送了一个学生信息\n");
//2.等待回复
recv(sock_fd,recv_buf,sizeof(recv_buf),);
printf("%s\n",recv_buf);
memset(recv_buf,,sizeof(recv_buf));
//3.信息处理
}
return ;
}
//服务器
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <arpa/inet.h>
#include <string.h>
#define MY_IP "192.168.149.137"
#define MY_PORT 5005
#define BACKLOG 100
#define DEBUF(X) printf(X) typedef struct commu
{
char name[];
int age;
int cmd;
}info; int main()
{
int sock_fd = -;//监听描述符
int client_fd = -;//连接fd
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;//客户地址
socklen_t len = ;//接收长度
int ret = -;
char recv_buf[];
char send_buf[];
//1,打开socket
sock_fd = socket(AF_INET,SOCK_STREAM,);
if(- == sock_fd)
{
perror("socket");
return -;
}
printf("sock_fd = %d.\n",sock_fd);
//2.bind绑定socket 和本机IP 端口
server_addr.sin_family = AF_INET;//IPV4
server_addr.sin_port = htons(MY_PORT);//设置端口模式
server_addr.sin_addr.s_addr = inet_addr(MY_IP);//设置IP
ret = bind(sock_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(- == ret)
{
perror("bind");
return -;
}
DEBUF("bind ok\n");
//3.listen 设 置监听端口
ret = listen(sock_fd, BACKLOG);//BACKLOG为排队处理
if(- == ret)
{
perror("listen");
return -;
}
DEBUF("listen ok\n");
//4.阻塞等待连接
client_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &len);
if(- == client_fd)
{
perror("listen");
return -;
}
DEBUF("成功简历连接\n");
//简历完成后可以通信
memset(recv_buf,,sizeof(recv_buf));
info st1;
while()
{
//1、 服务器收
recv(client_fd,&st1,sizeof(st1),);
printf("学生名字为:%s\n",st1.name);
printf("学生年龄为:%d\n",st1.age);
memset(recv_buf,,sizeof(recv_buf));
//2、 服务器处理数据
//3、 回复客户端
send(client_fd,"OK",,);
}
return ;
}
linux网络编程框架的更多相关文章
- Linux网络编程&内核学习
c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...
- Linux网络编程“惊群”问题总结
1.前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬.如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进 ...
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
- linux网络编程 no route to host 解决方案
linux网络编程 no route to host 解决方案 [整合资料] (2013-05-13 21:38:12) 转载▼ 标签: net iptables it 分类: Linux 参考资料h ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
随机推荐
- idea打断点是灰色的
点击这个图标,debug的断点就是灰色的,debug功能被禁用
- Daily Scrum7 11.11
今日任务: 徐钧鸿:结束了SQL和Affairs的移植,修改了连接池,学习C#和java的正则表达式并且完成相关的移植 张艺:个人阅读作业 黄可嵩:完成高亮显示的移植,进一步移植搜索代码 徐方宇:继续 ...
- 团队博客作业Week4 --- 学霸网站--NABC
1.需求(Need) 伴随着经济的发展,科学技术取得了飞速的发展,互联网在各行各业的发展中取得了广泛的应用.随着这些事物的发展,我们每个人都会接触到相当庞大的数据.如何在这些数据中找到自己需要的,如何 ...
- java(系统)实战1
在简单学习了java的布局和一些界面的绘制方法后,我便开始有了跟着视频和书本的知识学做一个简单的餐饮系统,才能激发自己的编程和不断巩固知识. 我简单说明一下本次做的系统很普通但具有实用性,是通过jav ...
- web04-LoginServlet
电影网站:www.aikan66.com项目网站:www.aikan66.com游戏网站:www.aikan66.com图片网站:www.aikan66.com书籍网站:www.aikan66.com ...
- java 框架 面试
Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...
- BATA冲刺准备
目录 第一部分 调研,评测 福大助手的bug IOS端 Android端 福大助手结构体系的思维导图 为什么开发人员没有发现这个bug 假设团队开发这款app,应注意哪些方面(架构.部署运维.微服务等 ...
- 《TCP/IP 详解 卷1:协议》第 2 章:Internet 地址结构
第二章介绍 Internet 使用的网络层地址,即熟知的 IP 地址.连接到 Internet 的设备,基于 TCP/IP 的专用网络中使用的设备都需要一个 IP 地址. 路由器(见 IP 协议 一章 ...
- xpath 去除空格
normalize,字面意思就是正规化 加入space 大概意思就是空格的处理了 官方解释是这样的: 通过去掉前导和尾随空白并使用单个空格替换一系列空白字符,使空白标准化.如果省略了该参数,上下文节 ...
- ZK Leader选举
1.Zookeeper节点状态LOOKING:寻找Leader状态,处于该状态需要进入选举流程LEADING:领导者状态,处于该状态的节点说明是角色已经是LeaderFOLLOWING:跟随者状态,表 ...