网络编程

重温网络编程(一)

亡梦爱人 提交于 2020-01-27 02:39:39
前言 近日突然发现自己忘记了网络编程,重新拾起一下。 几个概念性东西: 很多时候介绍socket连接通讯的时候,往往是上面这张图。 右边是服务器,左边是客户端。 服务器: 第一步: socket(), 是创建一个socket。这个过程我们使用的语言和操作系统?其实就是和我们调用http请求登录是一样的,会返回一个标识符,操作系统是服务端,我们的程序是客户端。 操作系统内部就做某些东西,可能是创建一个socket,然后返回一个标识码,通过这个标识码,后面调用其他的api,通过传输这个标识符,就可以操作改socket。 第二步:bind(),去绑定ip和port,因为只有通过ip和port才能找到服务器。 第三步: listen(),去监听,这个时候才开始了action。判断是否是这个地址,和端口,就可以创建连接。 第四步:accept(),比如有一个连接来了,操作系统首先帮助我们缓存起来,因为它不知道把这个连接的信息调用给谁,通过accept建立与操作系统的持久性连接,然后操作系统才能源源不断的把连接信息给到我们。 第五步或者第六步:如果没有accept我们的程序是无法收到消息的,但是我们的操作系统肯定是收到了的,毕竟建立了连接。而我们发现接受信息的时候,我们调用的是 recv(hSocket,message,sizeof(message)-1,0),我们和操作系统沟通接收信息

csapp网络编程初学笔记

…衆ロ難τιáo~ 提交于 2020-01-27 00:08:13
csapp网络编程初学笔记 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型,服务器管理某种资源,并且通过操作来为它的客户提供某种服务 客户端-服务器模型中的基本操作是transaction,由以下四步组成: 1.当一个客户端需要服务时,它向服务器发送一个请求。 2.服务器接收到请求后,解释它,并以适当的方式操作它的资源。 3.服务器给客户端发送一个响应,并等待下一个请求。 4.客户端接收响应并处理响应。 网络 客户端和服务器通常运行在不同的主机上,并借通过计算机网络的硬件和软件资源来通信。网络是个复杂的系统。 从程序员的角度来看的一个可工作的思考模型: 对于一个主机而言,网络只是又一种I/O设备,作为数据源和数据接收方。 网络物理层次: 1.以太网段(Ethernet segment):由电缆,集线器,不同主机构成。 2.桥接以太网(bridged Ethernet):较大的局域网,由多个以太网段和网桥构成。 3.互联网络(internet):由多个局域网和路由器构成。 协议 协议是运行在每台主机和路由器上的一种软件,这种软件实现了一种协议,这种协议控制主机和路由器如何协同工作来实现数据传输。互联网至关重要的特性是,它能由采用完全不同的和不兼容技术的各种局域网和广域网组成,所以才需要协议来实现某台源主机跨过所有这些不兼容的网络发送数据到另一台目的主机

网络编程与并发编程参考资料

喜夏-厌秋 提交于 2020-01-26 10:24:07
python 全栈开发,Day32(知识回顾,网络编程基础) python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用) python 全栈开发,Day34(基于UDP协议的socket) python 全栈开发,Day35(TCP协议 粘包现象 和解决方案) python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver) python 全栈开发,Day37(操作系统的发展史) python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块) python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型)) python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool) python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建) python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

Python网络编程

只谈情不闲聊 提交于 2020-01-26 01:49:50
简介 使用套接字进行网络编程。 网络编程 使用 socket 模块的 socket() 函数,可以创建套接字。 socket 模块函数 要创建套接字,必须使用 socket.socket() 函数,语法如下: socket(socket_family, socket_type, protocol=0) 其中, socket_family 是 AF_UNIX 或 AF_INET , socket_type 是 SOCK_STREAM 或 SOCK_DGRAM 。 protocol 通常省略,默认为 0 。 导入模块 创建 TCP/IP 套接字 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建 UDP/IP 套接字 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 套接字对象方法 服务器套接字方法 名称 描述 s.bind() 将地址(主机号、端口号对)绑定到套接字上 s.listen() 设置并启动 TCP 监听器 s.accept() 被动接受 TCP 客户端连接,一直等待知道连接到达(阻塞) 客户端套接字方法 名称 描述 s.connect() 主动发起 TCP 服务器连接 s.connect_ex() connect() 的扩展版本

⟅UNIX网络编程⟆⦔wait和waitpid函数-补充

扶醉桌前 提交于 2020-01-25 17:37:51
目录 说在前面 问题提出 问题解决 说在前面 环境: WSL、ubuntu16 参考: UNIX网络编程、 linux manual page 目录: 这里 本体: ⟅UNIX网络编程⟆⦔wait和waitpid函数 问题提出 见 问题 已知while(waitpid)是回收所有已终止进程的,但是它是如何解决“ 信号处理函数不可重入 ”的问题? 疑问来源: 在信号处理函数sig_child中如果使用wait,是不可以保证回收所有已终止的子进程。 在书上说是因为,“所有信号都在信号处理函数执行之前产生,而信号处理函数只执行一次”(因为在sig_child函数调用期间,SIGCHLD信号是阻塞的) 使用waitpid可以解决上述问题,因为WNOHANG可以让waitpid立即返回。 但是WNOHANG应该没有解决“所有信号都在信号处理函数执行之前产生,而信号处理函数只执行一次”(即信号处理函数不可重入)这个问题。 问题解决 首先, wait和waitpid,都不是用SIGCHLD触发的,只是很多人喜欢在信号处理函数里用wait/waitpid ; 其次, 在信号处理函数中用wait.waitpid是有风险的,信号处理函数时不能重入的,即如果信号函数没执行完,再来一个信号,有可能导致进程死锁 ; 推荐的用法, 信号处理函数中置标记位,退出信号处理函数后根据标记位调用wait

java socket编程

隐身守侯 提交于 2020-01-25 10:24:03
一、网络编程中两个主要的问题   一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。   目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提 出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也 能及时得到服务。 二、两类传输协议:TCP;UDP   TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。  

Boost.Asio C++ 网络编程之一:什么是Boost.Asio?

纵饮孤独 提交于 2020-01-25 01:55:52
引言 文章的内容是翻译 《Boost.Asio C++ Network Programming》这本书。 编译IDE环境是 vs2017 什么是Boost.Asio? 简单来说,Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库。 关于网络处理已经有很多解决方案,但是Boost.Asio是目前为止最优的方案。它在2005年就被包含进Boost,然后被大量Boost的用户测试并使用在许多项目中,比如:Remobo(http://www.remobo.com),可以让你创建你自己的即时私有网络(IPN);libtorrent(http://www.rasterbar.com/products/libtorrent)),一个用于实现比特流客户端的库;PokerTH (http://www.pokerth.net),一个支持LAN和互联网对战的纸牌游戏。 Boost.Asio在网络通信、COM串行端口和文件上成功地抽象了输入输出的概念。你可以基于这些进行同步或者异步的输入输出编程。 read ( stream , buffer [ , extra options ] ) async_read ( stream , buffer [ , extra options ] , handler ) write ( stream , buffer [ ,

Java 网络编程

心不动则不痛 提交于 2020-01-24 16:24:13
网络编程 网络模型 OSI参考模型 //应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 TCP/IP参考模型 //应用层 传输层 网际层 网络接口层 网络通讯要素 IP地址 //网络中设备的标识 本地回环地址 127.0.0.1 主机名 localhost 端口号 //标识进程的逻辑地址 有效端口 0~65535 其中0~1024系统使用或保留端口 传输协议 //通讯的规则 TCP UDP UDP 将数据及源和目的 封装成数据包中 不需要建立连接 每个数据包的大小限制在64K内 因无连接 是不可靠协议 不需要建立连接 速度快 TCP 建立连接 形成传输数据的通道 在连接中进行大数据量传输 通过三次握手完成连接 是可靠协议 必须建立连接 效率会稍低 InetAddress //IP地址 getLocalHost //获取本地地址IP对象 getHostAddress //IP地址字符串 getHostName //IP主机名 public class IPDemo { public static void main(String[] args) throws UnknownHostException { //获取本地主机ip地址对象。 InetAddress ip = InetAddress.getLocalHost(); //获取其他主机的ip地址对象。 ip =

java中网络编程

吃可爱长大的小学妹 提交于 2020-01-24 16:01:09
TCP/IP协议的四层模型,从底层到高层分别是:网络接口层、网络层、传输层、应用层。IP属于网络层,TCP/UDP属于传输层。IP定位对方的主机名,端口号对应接受数据的应用程序。 本地回环地址:127.0.0.1 主机名:localhost 有效端口:0~65535, 其中0~1024为系统保留端口。 IP地址由InetAddress类表示。没有构造函数,通过静态方法得到实例。 UDP:将数据及源和目的封装成数据包,不需要建立连接;每个数据包的大小限制在64k内;因无连接,是不可靠协议;速度快。 TCP:建立连接,形成传输数据的通道;在连接中进行大量数据传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率稍低。 Socket:网络之间的通信其实就是Socket之间的通信,Socket之间通过IO进行传输。 DatagramSocket:UDP使用的Socket接口,是本地的接口;发送、接受的单位为DatagramPacket。注意:这里DatagramPacket里面有get/setPort的操作,其中set为设置此包的目的端口号,而get有两种情况,一种是未发送的时候得到刚才set的端口号,一种是在接收端得到发送端的Socket的端口号(发送端DatagramePacket的设置的端口号)。所以getPort是Packet的得到Port的方法

java网络编程

会有一股神秘感。 提交于 2020-01-24 16:00:36
Socket :套接字,用于java网络编程的接口和一种机制,用套接字中的相关函数来建立连接和完成通信,socket可以看成在两个程序进行通信连接中的一个端点。 将区分不同应用程勋进程的三个参数 1.通信的目的地IP地址 2.使用的传输层协议 3.使用的端口号 与一个socket绑定。 1.每一个socket用一个半相关描述:(协议,本地地址,本地端口) 2.“套接字”或者“插座”(socket)也是一种软件形式的抽象,用于表达两台机器之间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象他们之间有一条虚拟的“线缆”。线缆的每一端都插入一个“套接字”或“插座”里。 3.套接字,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。   应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需通过同一个TCP协议端口传输数据。为了区别不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议提供了称为套接字(Socket)的接口。 4.区分不同应用程序进程间的网络通信和连接,主要有三个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是“插座”。通过将这三个参数结合起来,与一个“插座”Socket绑定