我正在尝试将图像编码为 base64 编码并将其发送到我正在创建的 C++ 服务器。我正在使用 PHP 来做到这一点。
因此,PHP代码是客户端,C++代码是监听服务器。
该问题出现在大图像上;例如 70KB 图像。它在小图像上工作正常;比如5KB。
发生的错误是:警告:socket_write() [function.socket-write]
:无法写入套接字 [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");
您可能会遇到许多问题。我假设你正在使用 TCP。我还假设您在一次调用 socket_write 中写入整个图像。我的第一个猜测是问题出在接收方。当您在接收端读取套接字时,不能保证一次读取即可获取整个数据块。通常,在读取 TCP 套接字时,您会循环读取并以这种方式累积数据,直到获得所需的所有数据,否则会出现错误。
您可以在其他 SO 帖子中看到一些示例代码:
从套接字读取:是否保证至少获取x字节?
EDIT
看到这些附加详细信息后,我的第一个建议是切换到 TCP。您可以以这种方式执行一次发送,然后在接收端循环读取,如上面的示例代码所示。否则,您将不得不分解数据包,并构建自己的错误检测代码以确保所有部分都到达,再加上放入序列代码以按顺序重新组装它们,这基本上只是复制 TCP 的一堆功能提供。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)