网络编程

muduo网络库源码阅读Step by Step

北城以北 提交于 2020-01-09 16:45:35
一般写服务端程序都需要有一个称手的网络库来帮我们处理琐碎的网络通信细节,比如连接的建立、关闭,读取数据,发送数据,接收、发送缓冲区的管理等,常用的C/C++网络库有libevent,asio,libev,我们项目组使用的是 muduo网络库 。muduo是 陈硕 写的,基于非阻塞IO和事件驱动的现代C++网络库,原生支持one loop per thread模型(即reactor模型),它适合开发Linux下的面向业务的多线程服务端网络应用程序。在Linux上muduo的性能(吞吐量、高并发下的事件处理效率)比其它网络库都要好,编程接口也很友好,它使用了很多Boost C++的现代特性(比如用RAII来管理资源,用function/bind来代替虚函数作为库的回调接口,借助shared_ptr实现线程安全的对象回调等),代码写得很精练简洁,而且源代码中附带有很多例子程序,是学习网络编程的很好范例,值得细细品读。 我从进项目组开始,花了6个月时间,把muduo相关的代码、例子程序、书都研究了一遍,感觉受益非浅,尤其是对处理网络通信的细节、异常处理了然于胸,写起代码来很顺溜。现在大概总结下阅读muduo网络库的顺序。 Step 0 熟悉boost智能指针、function/bind的使用 在muduo库内部使用了boost::scoped_ptr,weak_ptr,shared

Java网络编程

半世苍凉 提交于 2020-01-07 07:18:16
Java网络编程 简单了解一下Java的网络编程,JavaSE的学习我是跳过这部分的,在后来的Web学习中一直用的B/S架构,这部分用的不多,简单回顾一下。 Java中和网络编程有关的包在java.net.*包下,如InetAddress、NetworkInterface、Socket等。 1、网络接口类InetAddress、NetworkInterface InetAddress、NetworkInterface是Java提供用于获取ip和mac相关的类。 InetAddress 用于获取Ip相关。 该类没有构造方法,但提供了一系列静态方法用于获取相关对象。 例:获取本机ip: public static void main(String[] args) throws UnknownHostException, IOException { InetAddress host=InetAddress.getLocalHost();//本机对象 String hostname=host.getHostName();//获取主机名 System.out.println("主机名:"+hostname); String hostAdd=host.getHostAddress();//获取主机ip System.out.println("主机地址:"+hostAdd); } //主机名

网络编程基础——进程和多任务

半城伤御伤魂 提交于 2020-01-06 21:31:57
网络编程——进程: 1.进程: 程序是一堆文件,进程就是一个正在执行的文件,而CPU最终运行了你的程序。 操作系统调度作用:将你的磁盘上的程序加载到内存,然后交由CPU去处理,一个CPU正在运行的一个程序,就叫开启了一个 进程 。 串行: 所有的进程由cpu一个一个的解决。 并行:多个cpu,真正的同时运行多个进程。 并发:单个cpu,同时执行多个进程(来回切换的),看起来像是同时运行。 开启多个进程: socket: server,client 两个进程.python中,如果一次想开启多个进程,必须是一个主进程,开启多个子进程. 多进程: from multiprocessing import Process import time def task ( name ) : print ( f '{name} is running' ) time . sleep ( 3 ) print ( f '{name} is done' ) if __name__ == '__main__' : p = Process ( target = task , args = ( '怼哥' , ) ) p . start ( ) print ( '===主进程' ) 2.操作系统: 操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的基石和内核。操作系统需要处理如管理与配置内存

【Unix网络编程】chapter3套接字编程简介

放肆的年华 提交于 2020-01-06 04:20:42
chapter3套接字编程简介 3.1 概述 地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换。多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数,不过这两个新函数inet_pton和inet_ntop同时适用于IPv4和IPv6. 3.2 套接字地址结构   sockaddr_    3.2.1 IPv4套接字地址结构 IPv4套接字地址结构通常也称为"网际套接字地址结构",它以sockaddr_in命令,定义在<netinet/in.h>头文件中 struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint8_t sin_len; sa_family sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; } 3.2.2 通用套接字地址结构 #include <sys/socket.h> struct sockaddr { uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; }; eg:int bind(int, struct sockaddr *, socklen_t_); struct sockaddr

网络编程之TCP客户端开发和TCP服务端开发

我的未来我决定 提交于 2020-01-06 03:15:35
开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': # 创建tcp客户端套接字 # 1. AF_INET:表示ipv4 # 2. SOCK_STREAM: tcp传输协议 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和服务端应用程序建立连接 tcp_client_socket.connect(("192.168.131.62", 8080)) # 代码执行到此,说明连接建立成功 # 准备发送的数据 send_data = "你好服务端,我是客户端小黑!".encode("gbk") # 发送数据 tcp_client_socket.send(send_data) # 接收数据, 这次接收的数据最大字节数是1024 recv_data = tcp_client_socket.recv(1024) # 返回的直接是服务端程序发送的二进制数据 print(recv_data) # 对数据进行解码 recv_content = recv_data.decode("gbk") print("接收服务端的数据为:", recv_content) #

网络编程和并发之协程

一笑奈何 提交于 2020-01-04 05:10:34
一、引入  之前我们学习了线程、进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU调度的最小单位。 按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。   随着我们对于效率的追求不断提高, 基于单线程来实现并发 又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。   为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长       ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态    一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。   为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的

网络编程心得

喜夏-厌秋 提交于 2020-01-03 04:05:50
在网络编程中我们要学习很多知识: 在网络的大世界里,我们虽然知道我们能互相发送消息,互相通话,但是网络是如何这么准确的帮你找到你心心念念的她呢,接下来我们来探究一下神秘的网络如何帮我们来准确的互相发消息。 我们都应该听过一句老话,无规矩不成方圆,所以要想在和平安定的生活,就必须坚守法律规矩,所以呢网络世界也一样,要想和平相处不乱套,就需要遵守一些规则,所以就有了网络协议。数据才能安稳在网络世界里穿梭。 接下来我们来了解一些重要得协议,TCP和IP协议,通常我们叫它 TCP/IP协议 ,根据协议的功能的不同抽象成了4层。 接下来我们理解一下数据传送的路上的经历: 数据传输的时候先将数据从应用层传递到传输层,然后再从传输层传递到网络层,然后再传 递到链路层,最后在通过物理传输介质(网线)传递数据。 详细如下: ‘你好’(应用层)\ ==>传输层选择通信协议,tcp/udp协议==>网络层加上ip协议==>数据链路层(mac地址)==>物理层(网线,网卡) 接下来接收: 物理层==>数据链路层==>网络层==>传输层==>传输层==>应用层 然后,就是两台计算机在进行数据交换时候的历程(我给你发送消息,网络如何建立一个安全可靠的连接,并且进行数据传输): 首先来理解TCP协议,要建立一个安全可靠的连接就需要TCP协议的支持, TCP协议特点:数据安全,速度略低。分为客户端和服务端。

网络编程初识

☆樱花仙子☆ 提交于 2020-01-02 21:43:08
在不同计算机通过网络进行上传,下载。产生网络。 网络编程,编写程序进行网络上面进行交互 在日常生活中我们常见: 应用程序,如qq,网盘,等;还有在浏览器上运行的网站,它们分别基于 Cilent/Server 架构和 Browser/Server 架构。 C/S架构:客户端与服务器端架构。 B/S架构:浏览器端与服务器端架构。 计算机在网络中的位置(我如何能够准确地找到一台计算机,并且和它通信呢) 每一台计算机在网络世界里都有全球唯一的标识,就是IP地址,IP就是你的计算机上的网卡的全球唯一的物理地址(mac),长度为48位2进制,通常由12位16进制 数表示(前六位是厂商编号,后六位是流水线号) 当我们在发消息时,我们在网络世界里准确找到一台计算机,之后计算机自己要把消息在qq程序上呈现,那就得找到qq程序,我们如何找呢 计算机上通过端口号来找,因为计算机上的每一个应用程序运行都必须占用一个端口,端口的范围是0-65535。但是一般0-1023被一些其他应用已经 占用,因此我们一般从1024开始指定端口。 这样我们就完成了在网络上发送信息的定位流程 再在网络世界中我们再了解一下构成网络的结构( 局域网和广域网 ) 局域网:通俗来说就是多台计算机在较小的区域下形成的网络格局,互相通信,互相进行传输数据等功能,比如一个没插网线的路由器连接了几台电脑,你可以通过这个小局域网同屏或者传文件

python网络编程基础

冷暖自知 提交于 2020-01-02 21:11:43
   Socket(套接字)始于Unix,即人们所说的BSD Unix。socket家族有两种:基于文件系统的和基于网络的。第一种是基于文件系统的,地址家族表示为:AF_UNIX(或AF_LOCAL);第二种是网络Socket,是基于网络的,地址家族表示为AF_INET(AF_INET6表示ipv6)。   在Python 2.5 中加入了一种 Linux 套接字的支持:AF_NETLINK(无连接[见下])套接字家族让用户代码与内核代码之间的 IPC 可以使用标准 BSD 套接字接口。Python 只支持 AF_UNIX,AF_NETLINK,和 AF_INET 家族。这里将介绍使用最广泛的一个:AF_INET。   根据套接字类型,可以分为面向连接的和无连接的。   面向连接的,在通讯之前需建立一条连接,这种通讯方式提供了顺序的,可靠的,不会重复的数据传输,而且也不会被加上数据边界。实现这种连接的主要协议就是传输控制协议(即 TCP),其对应的套接字类型为 SOCK_STREAM。套接字使用 Internet 协议(IP)来查找网络中的主机,即TCP/IP协议来支持面向连接套接字。   无连接的,无需建立连接就可以进行通讯。实现这种连接的主要协议就是用户数据报协议(即 UDP) ,指定套接字类型为 SOCK_DGRAM。套接字使用 Internet 协议来查找网络中的主机

python网络编程

馋奶兔 提交于 2020-01-02 21:11:26
此篇博文是《python核心编程》的第16章的笔记 主要介绍了基于套接字的这种低级别的协议的使用,由于是底层的所以在调bug神马会非常受用 客户、服务器的几个例子: 硬件形式的:打印机服务器、文件服务器 软件形式的:web服务器、数据库服务器、窗口服务器 关于银行出纳也是这样类似的客户服务器模型 关于套接字 套接字是网络通信最为底层的东西 套接字的两个分类分别是: AF_UNIX(用于本地)与AF_INET(用于网络) Python 只支持AF_UNIX,AF_NETLINK,和AF_INET 家族。由于我们只关心网络编程,所以在本 章的大部分时候,我们都只用AF_INET 地址和端口 如果把套接字比做电话的插口——即通讯的最底层结构,那主机与端口就像区号与电话号码的 一对组合。有了能打电话的硬件还不够,你还要知道你要打给谁,往哪打。 套接字的另外一种分类方式: 面向连接 实现这种连接的主要协议就是传输控制协议(即TCP)。要创建TCP 套接字就得在创建的时候, 指定套接字类型为SOCK_STREAM。TCP 套接字采用SOCK_STREAM 这个名字,表达了它做为流套接字的 特点。由于这些套接字使用Internet 协议(IP)来查找网络中的主机,这样形成的整个系统, 一般 会由这两个协议(TCP 和IP)来提及 ,即TCP/IP。 无连接