OSI七层参考模型

是理想化的并没有完全实现的模型。
应用层
提供响应的应用服务

表示层
数据的表示和加密

会话层
建立会话关系

传输层
通过传输协议传输数据

网络层
实现跨子网通信,路由转发,维护路由表。

数据链路层
实现以太网内数据帧的转发

物理层
按照一定的传输规则传输电信号。

TCP/IP 四层模型

详细介绍见https://blog.csdn.net/Stars____/article/details/108694074

SCTP协议:TCP的升级版

TCP/IP 网络编程

unix域套接字:用于本地进程间的通信。

  1. Socket:是一个特殊的文件描述符。是一种通用的网络编程的接口。

    1. 在OSI模型中处于会话层和传输层之间。
    2. 在TCP/ IP模型中处于应用层和传输层之间。
    3. int socket(int family, int type, int protocol); 流式套接字(TCP)、数据包套接字(UDP)

  2. IP地址

    1. ipv4转换函数有inet_aton()、inet_addr()和inet_ntoa()
    2. ipv4和ipv6兼容的函数有inet_pton()和inet_ntop()
    3. 将strptr转换位网络字节序二进制值,仅适用于IPV4,此函数不能用于255.255.255.255的转换。
    4. pton能正确的处理255.255.255.255的转换问题。
    5. pton的逆用
    6. sa_family结构体定义在 #include <netinet/in.h> 中。
  3. 端口

  4. 字节序

    1. 本地字节序和网络字节序是不一样的。所以需要转换。
    2. 字节序转换涉及4个函数:htons()、ntohs()、htonl()、ntohl()。h代表host,n代表network,s代表short,l代表long
    3. bind():该函数将保存在相应地址结构中的地址信息与套接字进行绑定。它主要用于服务器端,客户端创建的套接字可以不绑定地址。
    4. listen():在服务端程序成功建立套接字并与地址进行绑定后,通过调用listen函数将套接字设置成监听模式(被动的),准备接收客户端的连接请求。
    5. accept():服务端通过调用accept函数等待并接受客户端的连接请求。建立好TCP连接后,该函数会返回一个新的已连接套接字。
    6. connect():客户端通过该函数向服务器端的监听套接字发送连接请求。
    7. send()和recv():用于TCP和UDP通信过程中发送和接收数据。
    8. sendto()和recvfrom():这两个函数一般用与UDP中的发送和接收,当用在TCP中时后面与地址有关的参数不起作用。函数作用等同于send()和recv()
    9. 通用结构体:
struct sockaddr{sa_family_t sa_family;  //协议char         sa_data[14];
};
  1. AF_INET定义结构体
struct sockaddr_in{sa_family_t sin_family; // 协议in_port_t    sin_port;   // 端口号的网络字节序struct in_addr sin_addr;//
};struct in_addr{uint32_t    s_addr; // IP地址 网络字节序
};

服务端

#include "net.h"#define BUFF_SIZE 128int main(int argc, char* argv[])
{int listenfd, connfd;struct sockaddr_in servaddr, cliaddr;socklen_t peerlen;char buf[BUFF_SIZE];if(argc < 3){printf("入参有误!\n");return -1;}// 建立socket连接if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}printf("listenfd = %d\n", listenfd);// 设置sockaddr_in 结构体中的相关参数bzero(&servaddr, sizeof(servaddr)); // 擦除内存 全写0servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2]));servaddr.sin_addr.s_addr = inet_addr(argv[1]);// 绑定函数if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){perror("bind");return -1;}printf("bind success!\n");// 调用listen()函数,设置监听模式if(listen(listenfd, 10) == -1){perror("listen");return -1;}printf("listening...\n");// 调用accept函数,等待客户端的连接peerlen = sizeof(cliaddr);while(1){if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr, &peerlen)) < 0){perror("accept");return -1;}bzero(buf, sizeof(buf));if(recv(connfd, buf, BUFF_SIZE, 0) == -1){perror("recv");return -1;}printf("Received a message: %s\n", buf);strcpy(buf, "Welcome to server");send(connfd, buf, BUFF_SIZE, 0);close(connfd);}close(listenfd);return 0;
}

客户端

#include "net.h"#define BUFF_SIZE 128int main(int argc, char* argv[])
{int sockfd;char buf[BUFF_SIZE] = "Hello server";struct sockaddr_in servaddr;if(argc < 3){printf("入参有误!\n");return -1;}// 创建socketif((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}// 设置sockaddr_in结构体中相关参数bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2]));servaddr.sin_addr.s_addr = inet_addr(argv[1]);// 调用connect函数向服务器发送连接请求if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){perror("connect");return -1;}// 发送消息给服务端send(sockfd, buf, sizeof(buf), 0);if(recv(sockfd, buf, BUFF_SIZE, 0) == -1){perror("recv");return -1;}printf("recv from server : %s\n", buf);close(sockfd);return 0;
}

TCP服务端客户端流程图

一个服务器服务多个客户端的TCP编程

主要还是对服务器端的优化。

  1. 循环服务器:分时处理客户端,直到前一个客户端退出后新的客户端才能被服务器响应

  2. 并发服务器:常用多线程实现,进程太过于耗费资源不常用

IO多路复用

在上述并发服务器中使用多线程能满足多个客户端的连接,但是客户端的数量上不能太多,假设有1000个客户端要连接这个服务器,那服务器就得开1000个线程,而且并不是每个客户端都是活跃的,对于那些不活跃的客户端服务器也不能释放线程资源,直到客户端断开连接,这样对服务器来说压力太大。

所以就有了IO多路复用。

多路复用IO
下一篇详细讲!

C语言网络编程——基础相关推荐

  1. C语言网络编程:多路IO select实现多客户端

    文章目录 阻塞式的服务器程序 多线程服务器程序 非阻塞式服务器程序 基于事件响应的服务器程序 事件响应服务器程序的实现`select` 阻塞式的服务器程序 我们接触过最多的最基础的网络通信模型为TCP ...

  2. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  3. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  4. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

  5. python作品阐述_Python网络编程基础的作品鉴赏-

    Python网络编程基础的作品鉴赏 Python网络编佳入门图书!175个完整,实践出真知,SocketsDNS.Web Service.FTP.Email.SMTP.POP.IMAP.SocketS ...

  6. 万物互联之~网络编程基础篇

    入门篇¶ 官方文档:https://docs.python.org/3/library/ipc.html(进程间通信和网络) 实例代码:https://github.com/lotapp/BaseCo ...

  7. java程序设计之网络编程基础教程_Java程序设计之网络编程基础教程

    基本信息 书名:Java程序设计之网络编程基础教程(21世纪高等学校计算机基础实用规划教材) :43.50元 作者:李芝兴 主编 出版社:清华大学出版社 出版日期:2012-12-1 ISBN:978 ...

  8. 看完之后保证你对socket编程步骤胸有成竹。 C++ Socket网络编程基础详解(TCP)

    C++ Socket网络编程基础详解(TCP版) ​    网络编程,就是编写程序使得两台计算机交换数据,其实从本质上来讲,网络编程最终所实现的功能,和我们文件的输入输出很相似,只是文件输入输出的对象 ...

  9. Python网络编程之二:网络编程基础

    Python网络编程之二:网络编程基础 一.基础概念 1.两个地址 1.1.mac地址 mac地址:直译为媒体存取控制位址,也称为局域网地址.MAC位址.以太网地址或物理地址,它是一个用来确认网络设备 ...

  10. python网络编程基础百度云_PYTHON网络编程基础 PDF 下载

    相关截图: 资料简介: <Python网络编程基础>全面介绍了使用Python语言进行网络编程的基础知识,主要内容包括网络基础知识.高级网络操作.Web Services.解析HTML和X ...

最新文章

  1. matlab while循环
  2. 50.什么是内部碎片?什么是外部碎片?
  3. 线性规划与网络流24题 运输问题(最裸的费用流了)
  4. Knative 基于流量的灰度发布和自动弹性实践
  5. 1Android系统移植与驱动开发概述
  6. 洛谷 P5708、P5714、P5720、P5725、P5726、P5732、P5738 题解
  7. 波卡生态跨链隐私中间件协议Raze Network与社区DeFi平台MANTRA DAO达成合作
  8. 在职工象棋赛上弃子拿下一盘
  9. “小程序”的最佳入口位置--关于微信小程序的思考笔记
  10. java api 版本控制_API 版本控制的几种方式
  11. golang微信小程序爬虫教程offer秀
  12. 全新ThihkPHP聚合支付系统源码+兼容全部易支付
  13. 计算机组装与维护doc,《计算机组装与维护》课程教案.doc
  14. Android发短信功能
  15. 英语知识点整理day02
  16. Latex表格排版大全 基于 IEEE双栏论文(设置单元格行列间距,自动换行设置)
  17. vtkPolyData获取bounds点坐标
  18. 《算法艺术与信息学竞赛》之 递推 例一 月亮之眼 vijos 1540
  19. 校友诗选_母校百年 同学聚会(来稿刊登)
  20. 金融分析:图形可视化plotly绘图思路—多子图教程

热门文章

  1. keil5安装之后的L6002U问题
  2. 《统计学》第八版贾俊平第二章课后习题及答案总结
  3. oracle的sqlplus命令讲解,SQL*PLUS使用 - Oracle sqlplus命令详解_数据库技术_Linux公社-Linux系统门户网站...
  4. 网易云音乐广告CTR预估模型演进过程
  5. mysql with rollup_MySQL-with rollup函数运用 _20160930
  6. 如何从网页上下载页面嵌入的PDF文件
  7. QT + OpenCV 使用摄像头
  8. springboot 架构图
  9. 米家扫地机器人按键没反应_小米扫地机系统重置键在哪?
  10. 详解NRF24L01无线收发模块