2

したがって、これは実際には 2 つの部分からなる質問であり、最初の質問から 2 番目の質問へと続きます。

私は PHP サーバー プロジェクトに取り組んでおり、ソケットを作成するさまざまな方法に少し混乱しています。新しい方法を使用して、それぞれ 3 つのソケットを作成することができました。もしあれば、これら3つの方法の根本的な違いを知っている人はいますか?

「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))

「fsockopen」を使用する方法 2

$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 ウィンドウ サイズを制御する方法を探して 3 つのオプションすべてを調べていました。データ ペイロードが 1460 バイトのパケットを LAN 経由でクライアントにプッシュしようとしていますが、パケット キャプチャを確認すると、パケットの TCP データ部分が常に 1448 バイトで短くなります。何か案は?

前もって感謝します!

4

2 に答える 2

1

これは、 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);
于 2011-05-19T03:34:08.400 に答える
0

一度に受信する実際のデータ量を制御することはできません。TCP はストリーミング プロトコルです。アプリケーションにバイトストリーム API を提供します。必要なものが得られるまで、読んで読み直す準備をするだけです。

于 2011-05-19T10:39:17.843 に答える