Вопрос

Итак, на самом деле это вопрос, состоящий из двух частей: первая ведет ко второй.

Я работаю над проектом 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top