1

画像を base64 エンコーディングにエンコードし、作成中の C++ サーバーに送信しようとしています。そのためにPHPを使用しています。

したがって、PHP コードはクライアントであり、C++ コードはリッスン サーバーです。

この問題は大きな画像で発生します。たとえば、70KB の画像。小さな画像でも適切に機能しています。5KBなど。

発生したエラーは次のとおりです: 警告: socket_write() [function.socket-write]: ソケット [0] に書き込めません: データグラム ソケットで送信されたメッセージが、内部メッセージ バッファーまたはその他のネットワーク制限よりも大きかったか、データグラムを受信するために使用されたバッファーが、ソケット [0] よりも小さかったです。データグラムそのもの。

この問題は、画像をいくつかの小さなパケットに分割せずに修正できますか?

送信パケットが 1MB である必要があるだけです。

これは私が使用しているコードです:

$con=file_get_contents("image url");
$binary_data=base64_encode($con);
$host = "192.168.35.54";
$port = 1060;
$message = $binary_data;
// No Timeout 
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket\n");
socket_connect($socket, $host, $port) or die("Could not connect to server\n");
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
4

2 に答える 2

0

ソケット送信バッファを、送信する最大の UDP データグラムと少なくとも同じ大きさに設定する必要があります。

PHPでそれを行う方法を私に尋ねないでください。ただし、Sockets APIレベルではオプションを使用setsockopt()していSO_SNDBUFます。

于 2013-04-10T00:44:58.370 に答える
0

考えられる問題はいくつかあります。TCPを使用していると思います。また、socket_write への 1 回の呼び出しでイメージ全体を書き込んでいると仮定しています。私の最初の推測では、問題は受信側にあるということです。受信側でソケットを読み取る場合、1 回の読み取りでデータ ブロック全体を取得できる保証はありません。通常、TCP ソケットを読み取るときは、ループを読み取って、期待するすべてのデータを取得するか、エラーが発生するまで、データを蓄積します。

この別の SO 投稿でいくつかのサンプル コードを確認できます。

ソケットからの読み取り: 少なくとも x バイトを取得することが保証されていますか?

編集

これらの追加の詳細を確認した後、私の最初の提案は TCP に切り替えることです。その方法で単一の送信を行い、上記のコード例のように受信側でループを読み取ることができます。それ以外の場合は、パケットを分割し、独自のエラー検出コードを組み込んで、すべての断片が到着することを確認する必要があります。さらに、シーケンスコードを挿入して、それらを順番に再構築する必要があります。これは、基本的に、TCP の機能の束を既に複製しているだけです提供します。

于 2013-04-09T17:25:41.453 に答える