2013-04-09 22 views
1

我想将图像编码为base64编码并将其发送到我正在创建的C++服务器。我使用PHP来做到这一点。使用php使用socket_write发送大型数据包

因此,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"); 

回答

0

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

你可以看到在这个其他SO后一些示例代码:

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

编辑

看到这些额外的细节后,我的第一个建议是切换到TCP。你可以这样做一次发送,然后在接收端循环读取,就像上面的示例代码一样。否则,你将不得不拆分数据包,并建立自己的错误检测代码以确保所有数据块都到达,并且按顺序重新组合它们,这基本上只是复制了一堆功能TCP已经提供。

+0

我使用UDP发送和接收数据。 这里是我使用的php代码: $ con = file_get_contents(“image url”); $ binary_data = base64_encode($ con); $ host =“ip”; $ port = 1060; $ message = $ binary_data; //无超时 set_time_limit(0); \t \t \t \t $插座= socket_create(AF_INET,SOCK_DGRAM,SOL_UDP)或死亡( “无法创建套接字\ n”); socket_connect($ socket,$ host,$ port)或死(“无法连接到服务器\ n”); socket_write($ socket,$ message,strlen($ message))或死(“无法将数据发送到服务器\ n”); – 2013-04-09 17:32:01

+1

好的,我刚刚看到了您收到的错误消息。基本上答案是否定的。你必须打破数据包。但除非你有一个很好的使用UDP的理由,否则我会切换到TCP。 – 2013-04-09 17:33:25

+0

为什么有人投这个答案? – 2013-04-12 05:41:39

0

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

不要问我该如何在PHP中做到这一点,但在套接字API级别,它是setsockopt()SO_SNDBUF选项。