Типы сокетов PHP и размер окна TCP
Вопрос
Итак, на самом деле это вопрос, состоящий из двух частей: первая ведет ко второй.
Я работаю над проектом PHP-сервера, и меня немного смущают различные способы создания сокета.Мне удалось создать три сокета каждый, используя новый метод.Кто-нибудь знает фундаментальную разницу между этими тремя методами, если таковая имеется?
Метод 1 с использованием «socket_create»
$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))
Способ 3 с использованием «stream_socket_client»
$Socket3 = stream_socket_client('tcp://'.$DestIP.':'.$DestPort)
//Method 3 Read
stream_socket_recvfrom($Socket3, $RecSize)
//Method 3 Write
stream_socket_sendto($Socket3, $SendMsg)
Хотя я не понимаю разницы, я изучал все три варианта в поисках способа управления размером окна TCP.Я пытаюсь передать пакет клиенту через мою локальную сеть, объем полезных данных которого составляет 1460 байт, и после просмотра захвата пакета часть данных TCP моего пакета всегда обрезается до 1448 байт.Есть идеи?
Заранее спасибо!
Решение
Вы не можете контролировать фактический объем данных, получаемых за один раз.TCP — это потоковый протокол.Он предоставляет приложению API байтового потока.Вам просто нужно быть готовым читать и перечитывать, пока не получите то, что хотите.
Другие советы
Вы должны быть в состоянии сделать это с помощью сокет_set_option команда (где параметры описаны в сокет_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);