用了很久php了却很少有机会用php进行一些二进制操作。 最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下:
包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容
1.包头的内容是记录帧内容的长度;
2. 加密:0表示不加密,1表示加密;
3. 命令码为服务端命令识别符号;
一开始不了解php原来有pack可以来组装二进制包, 走了弯路,让服务端开发人员用C语言帮忙开发了的几个内存操作函数,按照协议规则返回二进制包,然后我将这几个方法编译成一组扩展函数供php使用。
话归正题,本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少,不能很容易理解,特别是那些格式化参数的使用。
转摘的参数中文说明:
pack/unpack 的摸板字符字符 含义
a 一个填充空的字节串
A 一个填充空格的字节串
b 一个位串,在每个字节里位的顺序都是升序
B 一个位串,在每个字节里位的顺序都是降序
c 一个有符号 char(8位整数)值
C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U
d 本机格式的双精度浮点数
f 本机格式的单精度浮点数
h 一个十六进制串,低四位在前
H 一个十六进制串,高四位在前
i 一个有符号整数值,本机格式
I 一个无符号整数值,本机格式
l 一个有符号长整形,总是 32 位
L 一个无符号长整形,总是 32 位
n 一个 16位短整形,“网络”字节序(大头在前)
N 一个 32 位短整形,“网络”字节序(大头在前)
p 一个指向空结尾的字串的指针
P 一个指向定长字串的指针
q 一个有符号四倍(64位整数)值
Q 一个无符号四倍(64位整数)值
s 一个有符号短整数值,总是 16 位
S 一个无符号短整数值,总是 16 位,字节序跟机器芯片有关
u 一个无编码的字串
U 一个 Unicode 字符数字
v 一个“VAX”字节序(小头在前)的 16 位短整数
V 一个“VAX”字节序(小头在前)的 32 位短整数
w 一个 BER 压缩的整数
x 一个空字节(向前忽略一个字节)
X 备份一个字节
Z 一个空结束的(和空填充的)字节串
@ 用空字节填充绝对位置
分享到:
相关推荐
`shutdown()`函数用于部分或完全关闭一个套接字的读写能力。它可以关闭读、写或两者,这在结束一个通信会话时很有用,但又不希望立即关闭整个套接字。 ### socket() 最后,`socket()`函数用于创建一个套接字。它是...
socket 函数用于创建一个套接字,并返回一个整型描述符。该函数的原型为:`描述符 = socket(protofamily, type, protocol)`。 * `protofamily`:指定所使用的协议族,对 TCP/IP 协议族取值为 AF_INET。 * `type`:...
- `accept()`:当有客户端请求连接时,服务器调用`accept()`接收连接,并返回一个新的socket描述符用于与客户端通信。 - `connect()`:客户端调用`connect()`向服务器发起连接请求,目标是服务器的IP地址和端口号。 ...
Socket函数是网络编程中的核心部分,它提供了进程间通信(IPC)的能力,特别是在分布式系统中,使得一台计算机可以通过网络与其他计算机进行数据交换。本资源提供的`socket函数说明.docx`文档详细介绍了在Windows...
在Windows中,阻塞模式下,应用程序仍可以处理消息,但不能在同一个Socket上执行其他阻塞操作,否则会导致WSAINPROGRESS错误。 - **非阻塞模式**:调用函数不会立即阻塞,而是立即返回当前状态。如果数据未准备好,...
本项目以"Api函数编写的Socket客户端,有注释"为主题,是用Visual Studio 2010(VS2010)开发的一个示例,它没有使用C++标准库中的`socket`类,而是直接调用了Windows API函数来创建和管理Socket连接。以下是对这个...
bind函数是socket编程中一个非常重要的函数,它用于将一个套接字与一个地址相关联,以便在网络通信时能够正确地传输数据。这个函数的使用非常广泛,尤其是在服务器端,bind函数是必不可少的。 bind函数的函数原型是...
4. **接受连接**:当有客户端请求连接时,`accept()`函数会返回一个新的Socket描述符,专门用于与这个客户端的通信。此时,服务器可以创建一个新的线程来处理这个新Socket,而主监听线程可以继续`accept()`其他...
它们允许程序在一个Socket上有数据可读或可写时才执行相应操作,提高效率。 通过理解并熟练使用这些函数,开发者可以构建出功能丰富的网络应用程序,如Web服务器、FTP客户端等。在实际编程中,还需要考虑错误处理、...
6. **服务器端接受连接**:当有客户端连接时,服务器端调用`accept()`函数获取新的Socket描述符,用于与这个特定客户端的通信。 7. **数据传输**:客户端和服务器端都可以使用`send()`和`recv()`函数来发送和接收...
`socket_create()`函数用于创建一个socket资源,它需要三个参数:地址族(AF_INET代表IPv4,AF_INET6代表IPv6),套接字类型(SOCK_STREAM用于TCP,SOCK_DGRAM用于UDP),以及协议(通常为0,表示使用默认协议)。...
- `socket_create` 函数用于创建一个新的 socket。函数参数分别为:协议族(如 `AF_INET` 表示 IPv4)、socket 类型(如 `SOCK_STREAM` 表示 TCP)和协议(如 `SOL_TCP`)。 - 如果创建失败,该函数返回一个资源...
- **接受连接**:当有客户端连接时,使用`socket_accept()`函数接收连接请求,并返回一个新的Socket用于与客户端通信。 - **读写数据**:使用`socket_read()`和`socket_write()`函数在Server和Client之间交换数据。 ...
它等待并接收来自客户端的连接请求,一旦接收到请求,它会创建一个新的socket用于与该客户端进行通信,而原始的监听socket仍然可以继续接收其他客户端的连接请求。 **定义:** ```c int accept(int sockfd, struct ...
如果通过`WSACancelBlockingCall()`取消了一个非`accept()`或`select()`的阻塞调用,则之后只能调用`closesocket()`函数,因为取消操作会使Socket处于不确定状态。 #### 异步模式 - **异步模式**:调用函数时不会...
3. **接受连接**:当有客户端连接请求时,服务器调用`accept()`函数,这会返回一个新的socket描述符,专门用于与该客户端通信。这个新的socket是在服务器的主socket上等待连接时创建的。 4. **多线程处理**:对于每...
本文档是 Linux 套接字 Socket 编程手册,涵盖了 Socket 编程的各个方面,包括套接字函数、字节操作函数、IPv4 地址转换函数、IPv4、IPv6 通用地址转换函数和 TCP 套接口函数等。 套接字函数 套接字函数是 Socket ...
一个实现socket发送和接收函数,很实用可以借鉴
在IT行业中,网络编程是不可或缺的一部分,而socket接口是实现跨平台网络通信的标准API。`setsockopt`函数在socket编程中扮演着重要角色,它允许我们对socket进行各种配置,如设置超时、启用禁用套接字选项等。本文...
- **Socket 的定义**:Socket 是一种用于不同计算机之间进行通信的方法,它允许进程间通信(IPC),通常用于客户端-服务器架构中。 - **Socket 的类型**:包括流式套接字(`SOCK_STREAM`)用于提供可靠的、面向连接...