摘要: 这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。 为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读: 1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的? 2、 阅读全文
posted @ 2018-06-14 09:16 ralap7 阅读(1978) 评论(0) 推荐(0) 编辑
摘要: 在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字。操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,在操作系统内核中发生了什么事情呢?我们带着以下3个问题来细细分析:发送方法成功返回时,能保证TCP另 阅读全文
posted @ 2018-06-14 09:13 ralap7 阅读(1235) 评论(0) 推荐(0) 编辑
摘要: 最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。 编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通 阅读全文
posted @ 2018-06-14 09:10 ralap7 阅读(555) 评论(0) 推荐(0) 编辑
摘要: TCP协议中有个慢启动,在《TCP/IP详解卷一》中占据的篇幅很小,但是这个东西,在某些业务场景下,对性能的影响非常大。 什么是慢启动 最初的TCP的实现方式是,在连接建立成功后便会向网络中发送大尺寸的数据包,假如网络出现问题,很多这样的大包会积攒在路由器上,很容易导致网络中路由器缓存空间耗尽,从而 阅读全文
posted @ 2018-06-14 08:51 ralap7 阅读(3210) 评论(0) 推荐(0) 编辑
摘要: 本篇我们用一个测试机上的阻塞socket实例来说明主题。文章中所有图都是在测试系统上现截取的。 需要理解的3个概念 1. TCP socket的buffer 每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的 阅读全文
posted @ 2018-06-13 23:31 ralap7 阅读(1813) 评论(0) 推荐(0) 编辑
摘要: 总结一下C语言中宏的一些特殊用法和几个容易踩的坑。由于本文主要参考GCC文档,某些细节(如宏参数中的空格是否处理之类)在别的编译器可能有细微差别,请参考相应文档。 宏基础 宏仅仅是在C预处理阶段的一种文本替换工具,编译完之后对二进制代码不可见。基本用法如下: 1. 标示符别名 预处理阶段,foo = 阅读全文
posted @ 2018-06-12 11:28 ralap7 阅读(12512) 评论(0) 推荐(0) 编辑
摘要: atoi()函数 atoi()原型: int atoi(const char *str ); 函数功能:把字符串转换成整型数。 参数str:要进行转换的字符串 返回值:每个函数返回 int 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则atoi的返回值为 0。 注意:使 阅读全文
posted @ 2018-06-12 09:45 ralap7 阅读(56317) 评论(0) 推荐(2) 编辑
摘要: 3.2 Slice 一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。 一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素 并不一定就是数组的 阅读全文
posted @ 2018-06-11 23:30 ralap7 阅读(885) 评论(0) 推荐(0) 编辑
摘要: 3.1数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组中每个元素类型相同,又是连续分配,因此可以以固定的速度索引数组中的任何数据,速度非常快。 3.1.1声明和初始化 1、使用字面量声明数组: array := [5]int{10, 20, 30, 40, 阅读全文
posted @ 2018-06-11 23:23 ralap7 阅读(1852) 评论(0) 推荐(0) 编辑
摘要: 说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序。 1、堆和栈有什么区别? (1)栈由操作系统分配和释放;堆则是程序员手动去申请释放; (2)栈是一块连续的内存区域,也就是栈顶地址和栈的最大容量是系统规定的;堆是不连续的内存 阅读全文
posted @ 2018-06-08 00:09 ralap7 阅读(2288) 评论(0) 推荐(0) 编辑