字节序

Socket通信原理(2)

泄露秘密 提交于 2019-12-02 14:44:43
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页 时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是 socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下: 文章目录 一、网络中进程之间如何通信? 二、什么是Socket? 三、socket的基本操作 (一)socket()函数 (二)bind()函数 (三)listen()、connect()函数 (四)accept()函数 (五)read()、write()等函数 (六)close()函数 四、socket中TCP的三次握手建立连接详解 五、socket中TCP的四次握手释放连接详解 六、下面给出实现的一个实例 一、网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道、FIFO、消息队列) 同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程

超级马里奥这个系统开发流程

两盒软妹~` 提交于 2019-12-02 02:10:02
关于超级马里奥这个APP开发的要求,可以问阮生(181微4289电8881)可以开发源码,毕竟是我。现成当然可以快速上线,流程我们以后再详谈。 端口号 在同一台主机或设备上,可能有多个进程同时在使用TCP或UDP协议,端口号的作用就是区分这些不同的进程,即每个进程使用各自不同的端口号。 对于TCP协议和UDP协议,端口号都是用unsigned short类型表示,即端口号的范围为0-65535,这65536个端口号被分为3段: 众所周知端口(well-known port):范围为0-1023,这些端口被赋予了专用功能,如FTP的21端口、Web的80端口等,应用程序不能将它们用作其他功能 已登记端口(registered port):范围为1024-49151 临时端口:范围为49152-65535 well-known端口在Unix系统中称为保留端口,使用保留端口的服务器程序,必须以root用户启动运行。 套接字对 TCP套接字对是定义TCP连接两个端点的四元组,包括:本地IP地址、本地端口号、对端IP地址、对端端口号,每个端点的IP地址和端口号通常称为一个套接字。 TCP套接字对可用于唯一标识一个网络中的TCP连接。 套接字地址结构 大多数套接字API都需要一个指向套接字地址结构的指针作为函数参数,每个协议族都定义它自己的套接字地址结构,这些结构的名字均以sockaddr

字节序

孤人 提交于 2019-12-01 08:35:12
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。 人类还是习惯读写大端字节序,符合人类的阅读习惯。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存 python处理字节的内部模块 struct http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://www.liaoxuefeng.com/wiki/1016959663602400/1017685387246080 https://blog.erratasec.com/2016/11/how-to-teach-endian.html#.XaFGxuczZ25 https://segmentfault.com/a/1190000013959213?utm_source=channel-hottest 来源: https://www.cnblogs.com/shengulong/p/11673384.html

一次 utf-8 bom引起的问题

本秂侑毒 提交于 2019-12-01 04:30:33
同事代码新增加了功能,推到服务器上,意外导致登录失败,回退到之前的版本上,可以正常使用。 这次只上传了 route.php 文件,系统登录失败。 随后使用kdiff3对比了两版本的route.php文件,发现本地的route.php文件是带bom头的utf-8 之后使用 phpstorm批量转换文件格式 ,解决问题 ctrl+A选择项目 接着右键,或者alt+F 选择Remove BOM,这样就好了 UTF-8有BOM和无BOM的区别 BOM——Byte Order Mark,就是字节序标记 概念: 在 UCS 编码 中有一个叫做” ZERO WIDTH NO-BREAK SPACE “的字符,它的编码是 FEFF 。而 FFFE 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。 UCS规范建议我们在传输字节流前,先传输 字符” ZERO WIDTH NO-BREAK SPACE “。 如果接收者收到 FEFF ,就表明这个字节流是大字节序的;如果收到 FFFE ,就表明这个字节流是小字节序的。因此字符” ZERO WIDTH NO-BREAK SPACE “又被称作 BOM 。 作用: UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符” ZERO WIDTH NO-BREAK SPACE “的 UTF-8编码 是 EF BB BF

C/C++网络编程3——地址族与数据序列

巧了我就是萌 提交于 2019-12-01 01:21:11
  C/C++网络编程2中介绍了套接字,这一节介绍给套接字分配ip和端口号。ip用于标识一台主机,端口号用于标识一个主机中的一个应用程序,端口号占16位,0到65535,其中0到1023是知名端口号。 表示IPv4的结构体: struct sockaddr_in { sa_family_t sin_family; // 地址族 uint16_t sin_port; // 端口号 struct in_addr sin_addr; // 32位ip地址 char sin_zero[8]; // 不使用 }; struct in_addr { in_addr_t s_addr; // 32位IPv4地址 }; sin_family: AF_INET : IPv4地址族 AF_INET6 : IPv6地址族 AF_LOCAL : 本地通信中采用的UNIX协议的地址族 字节序:   大端序:高位字节存放低位地址。存放0x12345678   小端序 :高位字节存放高位地址。   网络通信中采用大端序。 字节序转换: unsigned short htons(unsigned short); unsigned short ntohs(unsigned short); unsigned long htonl(unsigned long); unsigned long ntohl(unsigned

网络编程基础之TCP编程学习(一)

丶灬走出姿态 提交于 2019-11-30 16:17:49
网络编程基础了解 socket套接字 socket 是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如 TCP/UDP 等网络通讯的手段。 linux 中的网络编程通过 socket 接口实现, socket 既是一种特殊的 IO ,提供对应的文件描述符。一个完整的 socket 都有一个相关描述 { 协议,本地地址,本地端口,远程地址,远程端口 }; 每个 socket 有一个本地唯一 Socket ,由操作系统分配。 定位某个计算机用 IP ,定位某个服务用端口。 创建Socket #include <sys/socket.h> int socket(int domain, int type, int protocol); 返回:成功返回描述符,出错返回 -1 ( 详细可以利用 指令 man socket 查看 ) 参数解释 domain    AF_INET    IPv4 因特网域    AF_INET6   IPv6 因特网域    AF_UNIX   unix 域    AF_UNSPEC 未指定 protocol   通常为 0, 表示按给定的域和套接字类型选择默认协议。 type (指定采用何种协议)    SOCK_STREAM   采用 TCP 协议(流式的套接字可以提供可靠的面向连接的通信流)    SOCK_DGRAM   

C# 大端与小端

时光总嘲笑我的痴心妄想 提交于 2019-11-30 11:01:07
c# 通信中字节序处理。 原文地址:https://blog.csdn.net/ybhjx/article/details/50475440 最近在写一个短信下发功能,客户端使用c#和java的短信网关的进行网络通信。 之前使用java进行开发,一切正常,改用c#无法收到网关应答。 想了半天意识到是不是网络字节序问题, java默认就是大端字节序,和网络字节序是一至的,所以不转换也不会有问题, 而c#在windows平台上是小端字节序。 网络发送字节流是按大端序发送,也就是从左到右发送,和c#的小端序相反,造成网关不能正常识别协议。 尝试c#中转换一下字节序,通信成功。 c#中字节序转换有两种方法。 非字串使用 System.BitConverter.GetBytes()方法,先读入字节数组中,然后再用Array.Reverse()对byte数组反序一下,得到大端序字节数组。 代码: short x = 6; byte[] a=System.BitConverter.GetBytes(x); //得到小端字节序数组 Array.Reverse(a); //反转数组转成大端。 另外c#直接提供了网络字节序转换方法。 System.Net.IPAddress.HostToNetworkOrder(本机到网络转换) System.Net.IPAddress

linux hexdump使用

谁都会走 提交于 2019-11-30 07:45:57
# hexdump -h hexdump: invalid option -- 'h' Usage: hexdump [options] file... Options: -b one-byte octal display#单字节八进制显示 -c one-byte character display#单字节字符显示 -C canonical hex+ASCII display#规范化 十六进制+ASCII 显示 -d two-byte decimal display#两字节十进制显示 -o two-byte octal display#两字节八进制显示 -x two-byte hexadecimal display#两字节十六进制显示 -e format format string to be used for displaying data#格式 用于显示数据的格式字符串 -f format_file file that contains format strings#格式文件 包含格式字符串的文件 -n length interpret only length bytes of input#长度 只解释输入的指定长度个字节 -s offset skip offset bytes from the beginning#偏移 跳过开头指定长度个字节 -v display

使用nodejs发送和接受tcp请求

匆匆过客 提交于 2019-11-30 01:59:22
使用nodejs发送和接受tcp请求 // 使用 promise-socket 同步执行 const {PromiseSocket} = require("promise-socket") const client = async (path, fileName) => { const socket = new PromiseSocket(); socket.setTimeout(1000) await socket.connect({host:ip, port:port}); let response = await socket.read(1) await socket.write(Buffer.from([IP.length%16, IP.length/16])); await socket.end(); return true; } tcp 是以字节流来发送和接受数据,通过wireshark可以看到 00 50 56 99 e8 00 3c fd fe 7c 78 01 08 00 45 00 00 34 cc 3b 40 00 36 06 77 58 3d a4 2f ce 0a 15 89 a9 1d f4 a6 67 a6 c8 9f e0 dd cc f7 fd 80 11 00 08 4a 6b 00 00 01 01 08 0a 6e ed 67 b1 05

python中socket模块属性

一曲冷凌霜 提交于 2019-11-29 19:45:45
数据属性 描述 AF_UNIX,AF_INET,AF_INET6 python支持的套接字家族 SOCK_STREAM,SOCK_DGRAM 套接字类型(TCP=流,UDP=数据报) has_ipv6 表示是否支持IPv6的标志变量 异常 描述 error 套接字相关错误 herror 主机和地址相关错误 gaierror 地址相关错误 timeout 超时 函数 描述 socket() 创建一个套接字对象 socketpair() 创建一对套接字 fromfd() 用一个已打开的文件描述符创建一个套接字对象 数据属性 描述 ssl() 在套接字初始化一个安全套接字层。不做证书验证 getaddrinfo() 得到地址信息 getfqdn() 返回完整的域的名字 gethostname() 得到当前主机名 gethostbyname() 由主机名得到对应的ip地址 gethostbyname_ex() gethostbyname()的扩展版本,返回主机名,主机所有的别名和IP地址列表 gethostbyaddr() 由IP地址得到DNS信息,返回一个类似gethostbyname_ex()的3元组 getservbyname()/getservbyport() 由服务名得到对应的端口号或相反 getprotobyname() 由协议名(如'tcp')得到对应的号码 数据属性 描述