PHP 套接字类型和 TCP 窗口大小


PHP Socket Types and TCP Window Size

所以这实际上是一个由两部分组成的问题,第一个问题导致第二个问题。

我正在处理一个PHP服务器项目,我对创建套接字的所有不同方法有点困惑。 我设法使用新方法创建了三个套接字。 有谁知道这三种方法之间的根本区别(如果有的话)?

使用"socket_create"的方法 1

$Socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
socket_bind($Socket1, $LocalIP, $LocalPort)
socket_connect($Socket1, $DestIP, $DestPort)
//Method 1 Read
socket_read($Socket1)
//Method 1 Write
socket_write($Socket1, $WriteMsg, strlen($WriteMsg))

方法 2 使用 'fsockopen'

$Socket2 = fsockopen($Server, $Port)
//Method 2 Read
fgets($Socket2)
//Method 2 Write
fputs($Socket2, $PutMsg, strlen($PutMsg))

使用"stream_socket_client"的方法 3

$Socket3 = stream_socket_client('tcp://'.$DestIP.':'.$DestPort)
//Method 3 Read
stream_socket_recvfrom($Socket3, $RecSize)
//Method 3 Write
stream_socket_sendto($Socket3, $SendMsg)

虽然我不明白其中的区别,但我正在探索所有三个选项,寻找一种控制TCP窗口大小的方法。 我正在尝试通过我的 LAN 将数据包推送到数据有效负载为 1460 字节的客户端,在查看数据包捕获后,数据包的 TCP 数据部分总是在 1448 字节处缩短。有什么想法吗?

提前感谢!

您无法控制一次接收的实际数据量。TCP 是一种流式处理协议。它向应用程序提供字节流 API。你只需要准备好阅读和重新阅读,直到你得到你想要的东西。

您应该能够使用 socket_set_option 命令执行此操作(其中选项记录在 socket_get_option 命令中):

$Socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
// send window
socket_set_option($Socket1, SOL_SOCKET, SO_SNDBUF, 1460);

请务必在socket_create后立即调用它。如果需要修改接收窗口:

socket_set_option($Socket1, SOL_SOCKET, SO_RCVBUF, 1460);