Я пытаюсь кодировать изображение к кодировке base64 и отправлять его на создаваемый мной C ++-сервер. Я использую PHP для этого.
Таким образом, PHP-код является клиентом, а код C ++ – сервером прослушивания.
Проблема возникает на больших изображениях; например, 70 КБ изображений. Он работает правильно на небольших изображениях; таких как 5 КБ.
socket_write() [function.socket-write]
ошибка: Warning: socket_write() [function.socket-write]
: невозможно записать в сокет [0]: сообщение, отправленное в сокет датаграммы, было больше, чем внутренний буфер сообщений или какой-либо другой сетевой предел, или буфер используемый для приема дейтаграммы, меньше, чем сама датаграмма.
Можно ли устранить эту проблему без деления изображения на несколько небольших пакетов?
Мне нужен только пакет отправки 1 МБ.
Это код, который я использую:
$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");
Существует ряд возможных проблем. Я предполагаю, что вы используете TCP. Я также предполагаю, что вы пишете все изображение одним вызовом socket_write. Мое первое предположение заключалось в том, что проблема – это получающая сторона. Когда вы читаете сокет на принимающей стороне, вы не гарантируете получение всего блока данных в одном чтении. Как правило, при чтении сокетов TCP вы читаете в цикле и накапливаете данные таким образом, пока не получите все данные, которые вы ожидаете, или получите ошибку.
Вы можете увидеть код примера в этом другом сообщении SO:
Чтение из сокета: гарантировано ли, по крайней мере, получить x байтов?
РЕДАКТИРОВАТЬ
Увидев эти дополнительные данные, моим первым предложением было перейти на TCP. Вы можете сделать одну отправку таким образом, а затем прочитать в цикле на принимающей стороне, как в приведенном выше примере кода. В противном случае вам придется разбить пакет и построить свой собственный код обнаружения ошибок, чтобы убедиться, что все части прибыли, а также поместить в коды последовательности, чтобы собрать их по порядку, что в основном просто дублирует кучу функциональности TCP уже обеспечивает.
Вам необходимо установить буфер отправки сокета как минимум на самую большую по времени отправку дейтаграммы UDP.
Не спрашивайте меня, как это сделать на PHP, но на уровне Sockets API это setsockopt()
с опцией SO_SNDBUF
.