使用socket使用socket发送大数据包

时间:2013-04-09 17:20:47

标签: php image networking packets

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

2 个答案:

答案 0 :(得分:0)

您可能遇到许多问题。我假设您正在使用TCP。我还假设你在一次调用socket_write时写了整个图像。我的第一个猜测是问题是接收方。当您在接收端读取套接字时,您无法保证在一次读取中获取整个数据块。通常情况下,在读取TCP套接字时,您会读取一个循环并以这种方式累积数据,直到获得所需的所有数据,否则会出现错误。

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

Read from socket: Is it guaranteed to at least get x bytes?

修改

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

答案 1 :(得分:0)

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

不要问我如何在PHP中执行此操作,但在套接字API级别,setsockopt()使用SO_SNDBUF选项。