1

我正在尝试将图像编码为 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");
4

2 回答 2

0

您可能会遇到许多问题。我假设您正在使用 TCP。我还假设您在一次调用 socket_write 时写入整个图像。我的第一个猜测是问题出在接收方。当您在接收端读取套接字时,不能保证一次读取就获得整个数据块。通常,在读取 TCP 套接字时,您会循环读取并以这种方式累积数据,直到您获得所有您期望的数据,或者您遇到错误。

您可以在其他 SO 帖子中看到一些示例代码:

从套接字读取:是否保证至少获得 x 个字节?

编辑

在看到这些额外的细节后,我的第一个建议是切换到 TCP。您可以通过这种方式进行一次发送,然后像上面的示例代码一样在接收端循环读取。否则,您将不得不分解数据包,并构建自己的错误检测代码以确保所有部分都到达,再加上按顺序重新组装它们的序列代码,这基本上只是复制了一堆 TCP 功能提供。

于 2013-04-09T17:25:41.453 回答
0

您需要将套接字发送缓冲区设置为至少与您发送的最大 UDP 数据报一样大。

不要问我如何在 PHP 中做到这一点,但在 Sockets API 级别它是setsockopt()带有SO_SNDBUF选项的。

于 2013-04-10T00:44:58.370 回答