套接字

UNP——第三章,套接字编程介绍

徘徊边缘 提交于 2020-01-20 22:27:16
1.套接字结构   多数套接字函数都有套接字结构参数,每个协议族都定义了自己的套接字结构,以 sockaddr_ 开始,并对应协议族的唯一后缀。   如 IPv4 sockaddr_in     IPv6 sockaddr_in6    Unix sockaddr_un 链路 sockaddr_dl 存储 sockaddr_storage struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }   其中 sin_len 用于内核层,在应用读写都无意义。   sin_zero 没有用处。   POSIX也要求要定义 sin_family, sin_addr, sin_port 2.传参   套接字调用,参数以引用方式,在内核和应用传递。   当参数 ,应用 ----> 内核,需要传 len_of_socket     如: bind, connect, sendto    内核 -----> 应用,需要传 &len_of_socket     即 len_of_socket 做输入,输出参数。 3.字节序   网络字节序为大端,即先存储数据高位。   小端,则为 先存储数据地位。  

Linux网络编程 - 套接字和地址

﹥>﹥吖頭↗ 提交于 2020-01-20 20:22:03
1. socket 到底是什么? 在网络编程,socket,中文翻译为 套接字,有的时候也叫套接口 。它的寓意是通过插口接入的方式,快速完成网络连接和数据收发。可以把它从想象成现实世界的电源插槽,或者早起上网需要的网络插槽,所以 socket也可以看做是对物理世界的直接映射。 先上一张图,可以看看: 这张图是网络编程中,客户端和服务端工作的核心逻辑。先从右侧服务端开始看,因为在客户端发起连接请求之前,服务端必须先初始化好。首先初始化socket,之后服务器执行 bind() 绑定,将自己的服务能力绑定在一个众所周知的地址和端口上。紧接着,执行 listen() ,将原先的 socket转化为服务端的socket,服务端最后阻塞在 accept() 等待客户端请求的到来。 服务端准备就绪后,客户端需要先初始化 socket,再执行 connect() 向服务端的地址和端口发起连接请求,这里的地址必须是客户端预先知晓的。这个过程就是 TCP三次握手,具体的后面会详细阐述。 三次握手成功后,客户端和服务端之间就可以进行数据传输。具体来说,客户端向内核发起write字节流写操作,内核协议栈将字节流从网络设备发送到服务端,服务端从内核得到信息,将字节流从内核读到进程中,并开始业务逻辑的处理,完成之后,服务端再将得到的结果以同样的方式写回到客户端。可以看到, 一旦连接建立

网络编程

房东的猫 提交于 2020-01-20 04:58:49
网络编程 1. 软件开发的架构 C/S架构 B/S架构 2. socket编程 2.1 socket通信流程 2.2 基于TCP协议的socket 2.3 基于UDP协议的socket 2.4 实例(初恋的故事) 2.5 实例(模拟qq聊天室) 3. 黏包现象 3.1 黏包成因 3.2 会发生黏包的两种情况 3.3 黏包的解决方案 4. socket的更多方法介绍 5. 验证客户端链接的合法性 6. socketserver 1. 软件开发的架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用 第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构: C/S架构 C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。 B/S架构 B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。 Browser浏览器,其实也是一种Client客户端

proc/sys/net/ipv4/下各项的意义

て烟熏妆下的殇ゞ 提交于 2020-01-19 05:58:12
/proc/sys/net/ipv4/icmp_timeexceed_rate 这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。 /proc/sys/net/ipv4/igmp_max_memberships 主机上最多有多少个igmp (多播)套接字进行监听。 /proc/sys/net/ipv4/inet_peer_gc_maxtime 求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies. /proc/sys/net/ipv4/inet_peer_gc_mintime 每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候,调整这个间隔很有效。以jiffies计。 /proc/sys/net/ipv4/inet_peer_maxttl entries的最大生存期。在pool没有内存压力的情况下(比如

python基础——socket

人盡茶涼 提交于 2020-01-19 03:48:20
一.socket概念 1.理解socket 络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可 供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式; Socket是发动机,提供了网络通信的能力。 Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述 IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运 行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同 的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号, 有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座, 就可以得到不同的服务。 Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式, 它把复杂的 TCP/IP协议族隐藏在

26.python网络编程

不打扰是莪最后的温柔 提交于 2020-01-19 00:04:50
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好。 但是如果这两个程序之间想要传递一个数据,你要怎么做呢? 这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了。 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢? 类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。 二.软件开发的架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用 第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构 1.C/S架构 C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。 2.B/S架构 B/S即:Browser与Server,中文意思

/proc/sys/net/ipv4/下各项的意义

梦想与她 提交于 2020-01-18 06:50:56
/proc/sys/net/ipv4/icmp_timeexceed_rate 这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。 /proc/sys/net/ipv4/igmp_max_memberships 主机上最多有多少个igmp (多播)套接字进行监听。 /proc/sys/net/ipv4/inet_peer_gc_maxtime 求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies. /proc/sys/net/ipv4/inet_peer_gc_mintime 每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候,调整这个间隔很有效。以jiffies计。 /proc/sys/net/ipv4/inet_peer_maxttl entries的最大生存期。在pool没有内存压力的情况下(比如

Socket读写数据流程

女生的网名这么多〃 提交于 2020-01-18 05:15:48
当客户端和服务器使用TCP协议进行通信时,客户端封装一个请求对象req,将请求对象req序列化成字节数组,然后通过套接字socket将字节数组发送到服务器,服务器通过套接字socket读取到字节数组,再反序列化成请求对象req,进行处理,处理完毕后,生成一个响应对应res,将响应对象res序列化成字节数组,然后通过套接字将字节数组发送给客户端,客户端通过套接字socket读取到字节数组,再反序列化成响应对象。 通信框架往往可以将序列化的过程隐藏起来,我们所看到的现象就是上图所示,请求对象req和响应对象res在客户端和服务器之间跑来跑去。 也许你觉得这个过程还是挺简单的,很好理解,但是实际上背后发生的一系列事件超出了你们中大多数人的想象。通信的真实过程要比上面的这张图复杂太多。你也许会问,我们需要了解的那么深入么,直接拿来用不就可以了么? 在互联网技术服务行业工作多年的经验告诉我,如果你对底层机制不了解,你就会不明白为什么对套接字socket的读写会出现各种奇奇乖乖的问题,为什么有时会阻塞,有时又不阻塞,有时候还报错,为什么会有粘包半包问题,NIO具体又是什么,它是什么特别新鲜的技术么?对于这些问题的理解都需要你了解底层机制。 5、Socket读写的细节过程分析 为了方便大家对通信底层的理解,我花了些时间做了下面这个动画,它并不能完全覆盖底层细节的全貌

proc/sys/net/ipv4/下各项的意义

别来无恙 提交于 2020-01-18 03:21:31
/proc/sys/net/ipv4/icmp_timeexceed_rate 这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。 /proc/sys/net/ipv4/igmp_max_memberships 主机上最多有多少个igmp (多播)套接字进行监听。 /proc/sys/net/ipv4/inet_peer_gc_maxtime 求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies. /proc/sys/net/ipv4/inet_peer_gc_mintime 每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候,调整这个间隔很有效。以jiffies计。 /proc/sys/net/ipv4/inet_peer_maxttl entries的最大生存期。在pool没有内存压力的情况下(比如

传输协议三

落爺英雄遲暮 提交于 2020-01-17 12:01:55
五、建立 TCP客户端 讨论了套接字类的功能后,我们将分析一个完整的 TCP客户端程序。此处我们将看到的客户端程序是一个daytime客户端,它连接到一个daytime服务器程序以读取当前的日期和时间。建立套接字连接并读取信息是一个相当简单的过程,只需要少量的代码。 默认情况下 daytime服务运行在13端口上。并非每台计算机都运行了daytime服务器程序,但是Unix服务器是客户端运行的很好的系统。如果你没有访问Unix服务器的权限,在第七部分我们给出了TCP daytime服务器程序代码--有了这段代码客户端就可以运行了。 DaytimeClient的代码 import java.net.* import java.io.*; public class DaytimeClient { public static final int SERVICE_PORT = 13; public static void main(String args[]) { // 检查主机名称参数 if (args.length != 1) { System.out.println ("Syntax - DaytimeClient host"); return; } // 获取服务器程序的主机名称 String hostname = args[0]; try { //