编程技巧

很全的linux网络编程技巧

我只是一个虾纸丫 提交于 2020-03-17 03:51:39
1. LINUX 网络编程基础知识 1 1.1. TCP/IP 协议概述 1 1.2. OSI 参考模型及 TCP/IP 参考模型 1 1.3. TCP 协议 3 1.4. UDP 协议 5 1.5. 协议的选择 6 2. 网络相关概念 6 2.1. socket 概念 7 2.2. socket 类型 8 2.3. socket 信息数据结构 8 2.4. 数据存储优先顺序的转换 8 2.5. 地址格式转化 9 2.6. 名字地址转化 10 3. socket 编程 13 3.1. 使用 TCP 协议的流程图 13 3.2. 使用 UDP 协议的流程图 24 3.3. 设置套接口的选项 setsockopt 的用法 31 3.4. 单播、广播、组播(多播) 32 1. LINUX 网络编程基础知识 1.1. TCP/IP 协议概述 协议 protocol:通信双方必须遵循的规矩 由iso规定 rpc文档 osi参考模型:(应-表-会-传-网-数-物) è 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 tcp/ip模型4层: 应用层 {http超文本传输协议 ftp文件传输协议 telnet远程登录 ssh安全外壳协议 stmp简单邮件发送 pop3收邮件} 传输层 {tcp传输控制协议,udp用户数据包协议} 网络层 {ip网际互联协议 icmp网络控制消息协议

新手必看的C#编程技巧!

萝らか妹 提交于 2020-03-11 09:23:19
1.如果可能尽量使用接口来编程 .NET框架包括类和接口,在编写程序的时候,你可能知道正在用.NET的哪个类。然而,在这种情况下如果你用.NET支持的接口而不是它的类来编程时,代码会变得更加稳定、可用性会更高。请分析下面的代码: private void LoadList (object [] items, ListBox l) {  for (int i = 0; i < items.Length;i++)   l.Items.Add (items[i].ToString ()); }这个函数从一个可为任何对象的数组中加载ListBox,这段代码被限定为只能使用数组。假想过些时候你发现那些对象存在数据库中,或别的集合中。那么你 需要修改程序来使用不同的集合类型。如果你用ICollection接口来写那段程序,你就不用修改那段程序了,对于任何实现ICollection接口 的类型它都能很好的工作: private void LoadList (ICollection items,ListBox l) {   foreach (object o in items)   l.Items.Add (o.ToString ()); } ICollection被数组和所有System.Collection中的集合实现。此外,多维数组也支持ICollection接口。如果那还不够的话,数据库

{php 编程技巧}

泪湿孤枕 提交于 2020-03-10 11:40:32
每种开发语言都有自己的特有的东西,PHP也不例外,虽然我只是刚刚开始学习PHP,但2年的Java经验,一年的.NET经验对于我来说,PHP一点也不难,关键是于积累,收集了一些PHP的编程技巧,记录下,以后备用。 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。 1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row[’id’] 的速度是$row[id]的7倍。 3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。 4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。 5、注销那些不用的变量尤其是大数组,以便释放内存。 6、尽量避免使用__get,__set,__autoload。 7、require_once()代价昂贵。 8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。 9、如果你想知道脚本开始执行

JS高阶编程技巧--柯理化函数

梦想的初衷 提交于 2020-02-13 16:12:59
首先看一段代码: let obj = { x: 100 }; function fn(y) { this.x += y; console.log(this); } 现在有一个需求:在1秒后,执行函数fn,并让其this指向obj。 如果写成 setTimeout(fn, 1000); 这么写的话,fn函数中的this是指向window的,而且也没有传递参数。 如果写成 setTimeout(fn(200), 1000); 这么写的话,this指向依然是window,而且相当于立即执行fn函数,并把结果赋给定时器1秒后再执行,这样肯定不行。 如果写成 setTimeout(fn.call(obj,200), 1000); 这么写的话,用call或apply虽然改变了this指向,但都是函数立即执行并把返回结果赋给了定时器,依然无法完成需求。 如果写成 setTimeout(function() { fn.call(obj, 200); }, 1000); 这么写的话,用一个匿名函数包起来,等到1秒后执行匿名函数里边的代码,这样便可以完成上述需求。 从中我们可以看出,在某一个阶段之后执行某些代码,我们需要预先把this指向、参数等预先准备好,这种预先处理的思想即柯理化思想。 即,柯理化函数的思想:利用闭包的机制,把一些内容事先存储和处理了,等到后期需要的时候拿来用即可。 当然

JS高阶编程技巧--惰性函数

若如初见. 提交于 2020-02-12 16:56:45
在vue、react等框架大量应用之前,我们需要使用jQuery或者原生js来操作dom写代码,在用原生js进行事件绑定时,我们可以应用DOM2级绑定事件的方法,即: 元素.addEventListener() ,因为兼容性,还有: 元素.attachEvent() 。所以我们需要封装成一个方法: function emit(element, type, func) { if (element.addEventListener) { element.addEventListener(type, func, false); } else if (element.attachEvent) { element.attachEvent('on' + type, func); } else { //如果不支持DOM2级事件 element['on' + type] = func; } } 这个时候,如果一个元素需要通过一个行为添加多个点击事件,如: emit(div, 'click', fn1); emit(div, 'click', fn2); 在第一次给div进行fn1事件绑定时,已经知道浏览器可以执行哪种绑定方式,执行绑定fn2时,就没有必要再次进行判断,那么代码可以进行修改: function emit(element, type, func) { if (element

Python全栈(四)高级编程技巧之10.Python多任务-协程

社会主义新天地 提交于 2020-02-07 22:00:53
文章目录 一、生成器-send方法 1.同步、异步 2.堵塞、非堵塞 3.生成器的send()方法 二、使用yield完成多任务和yield from 1.使用yield完成多任务 2.yield from的使用 三、协程-使用greenlet&gevent完成多任务 1.协程概念 2.使用greenlet完成多任务 3.使用gevent完成多任务 4.gevent简单应用 5.进程、线程和协程对比 一、生成器-send方法 1.同步、异步 同步: 是指代码调用 IO操作 时,必须等待IO操作完成才返回的调用方式。 异步: 是指代码调用 IO操作 时,不必等IO操作完成就返回的调用方式。 同步异步比较如下: 2.堵塞、非堵塞 阻塞: 从调用者的角度出发,如果在调用的时候,被卡住,不能再继续向下运行,需要等待,就说是阻塞。 堵塞的例子有: 多个用户同时操作数据库和锁机制 Socket的 accept() 方法 input() 非阻塞: 从调用者的角度出发,如果在调用的时候,没有被卡住,能够继续向下运行,无需等待,就说是非阻塞。 3.生成器的send()方法 之前讲到生成器: def create_fib ( num ) : a , b = 0 , 1 current_num = 0 while current_num < num : yield a a , b = b , a + b

Python全栈(四)高级编程技巧之4.元类编程、迭代器和生成器

◇◆丶佛笑我妖孽 提交于 2020-02-03 05:44:37
文章目录 一、__getattr__和__getattribute__魔法函数 二、属性描述符 1.属性描述符分析 2.属性查找顺序 三、自定义元类 1.动态创建类 2.使用type创建类 四、metaclass属性 五、迭代器和生成器 1.迭代器 2.生成器 应用:生成器读取大文件 一、__getattr__和__getattribute__魔法函数 from datetime import date class User : def __init__ ( self , name , birthday ) : self . name = name self . birthday = birthday if __name__ == "__main__" : user = User ( "corley" , date ( year = 2020 , month = 1 , day = 1 ) ) print ( user . name ) 打印 corley 当打印不存在的属性时,会报错: from datetime import date class User : def __init__ ( self , name , birthday ) : self . name = name self . birthday = birthday if __name__ == "__main

Python全栈(四)高级编程技巧之2.类与对象深度问题与解决技巧

我怕爱的太早我们不能终老 提交于 2020-01-31 03:47:29
文章目录 一、派生内置不可变类型并修改其实例化行为 二、创建大量实例节省内存 三、Python中的with语句 四、创建可管理的对象属性 五、类支持比较操作 六、环状数据结构中管理内存 一、派生内置不可变类型并修改其实例化行为 引入: 我们想自定义一种新类型的元组,对于传入的可迭代对象,我们只保留其中int类型且值大于0的元素,例如: IntTuple([2,-2,'jr',['x','y'],4]) => (2,4) 如何继承内置tuple 实现IntTuple? 自定义IntTuple: class IntTuple ( tuple ) : def __init__ ( self , iterable ) : for i in iterable : if isinstance ( i , int ) and i > 0 : super ( ) . __init__ ( i ) int_t = IntTuple ( [ 2 , - 2 , 'cl' , [ 'x' , 'y' ] , 4 ] ) print ( int_t ) 打印 Traceback ( most recent call last ) : File "xxx/demo.py" , line 7 , in < module > int_t = IntTuple ( [ 2 , - 2 , 'cl' , [ 'x'

如何阅读别人的代码?

亡梦爱人 提交于 2020-01-26 14:18:18
1. 不要畏惧 。我发现大家都经常会感叹XXX强大,YYY流行,无形中你会把它放在一个不可触及到的地位,感觉它很难,而令自己不敢去挑战它。 2. 带着问题去阅读代码 ,这也是我认为最有效的方式。这会让你在阅读时候有个主线,比较有针对性。 3. 断点调试。 在Python代码中使用pdb一般不太好使,因为代码复杂的话,这种断点需要你使用多个n跳到对应的位置,我一般都是先抛出异常,然后使用pdb的up/down/n等命令调试。当然在目标位置添加一些print日志或注释部分代码然后直接使用exit()退出也是可以的。 4. 理解作者的思考方式。 不同的项目要有不同的思考方式来阅读,不要拧着自己的习惯去阅读,这样会很累,得尝试接受别人的观点,甚至于改变自己。 7. 记忆并绘制项目架构。 项目就是一堆代码的组合,除了学习编程技巧,还要了解项目的架构决策,这对于未来自己写大型项目非常用用。这种理解越补充,你会对它就越来越清晰。 参考其他地方的 阅读代码之前弄清楚下面两点是很有帮助的: 1,理论层面。是基于什么理论来实现功能的。 2,提供了什么样的API接口,也就是说,暴露给用户的是哪些功能,这个可以反推出基本的模块有哪些 分层次阅读   在阅读代码的时候不要一头就扎下去,这样往往容易只见树木不见森林,阅读代码比较好的方法有一点二叉树的广度优先的遍历。 在程序主体一般会比较简单

c++编程技巧

不羁岁月 提交于 2020-01-21 23:02:38
  c++庞大精深,在学习时必须有一定的代码量,写的多了,慢慢就知道c++代码怎么写了。 typedef Rect_<int> Rect2i; //typedef的使用。 typedef Rect_<float> Rect2f; typedef Rect_<double> Rect2d; typedef Rect2i Rect;    来源: https://www.cnblogs.com/Robin008/p/12227181.html