gpt4 book ai didi

php - Unix 套接字发送接收客户端到服务器大块数据错误

转载 作者:行者123 更新时间:2023-11-28 02:37:09 24 4
gpt4 key购买 nike

我在处理大量数据的client(php)-server(c++) 通信时遇到问题。服务器(c++)无法从客户端(php)接收大块数据。当客户端发送少量信息时一切正常,但是当我尝试发送大块(即 ~8kb)时,我的通信断开(不知道服务器收到什么,因为它是后台进程)。

请接收我使用的以下代码,如果可能请更正它:

连接后的 PHP 部分(发送 $sendbuf):

        socket_set_nonblock($fd);               
$b_time = 20;
$b_tries= 0;
while($b_time)
{
if (($sc=@socket_connect($fd, $file))==FALSE && $b_tries > $b_time)
{
@socket_close($fd);
return false;
}
else if ($sc == true)
{
break;
}
$b_tries++;
}

$b_time=time();
while($b_time)
{
$wd=array();

array_push($wd,$fd);

if (false===($num = @socket_select($rd=NULL, $wd, $er=NULL, $select_timeout)))
{
@socket_close($fd);
return $result;
}
else
{
if ($num > 0)
{
if (false===($out_now=@socket_write($fd, $sendbuf, strlen($sendbuf))))
{
@socket_close($fd);
return false;
}

$b_time=$tm;

$sendbuf=substr($sendbuf,$out_now);

if (!strlen($sendbuf)) break;
}
else if ((time()-$b_time)>$timeout_write)
{
@socket_close($fd);
return false;
}
}
}

//如果正常,则从服务器接收应答,但没有应答。

C++ 部分:

int Socket::receive ( std::string& s ) const
{

if ( current_socket < 0 ) return false; // error socket failed!

char buf [1025];
memset(buf, 0, 1025);

// cleanup string
s = "";

int done = 0;
int status_or_nbytes = 0;
char* pch;
do {
status_or_nbytes = ::recv ( current_socket, buf, 1024, 0 );
if ( status_or_nbytes == 1024 )
{ // not all message readed, instead last byte is not SPECIAL_CHAR
if ( buf[1023] == 26 )
{
//std::cout << "S 26! " << std::endl;
buf[1023] = '\0';
done = 1;
}

s += buf;
}
else if ( status_or_nbytes > 0 ) // < 1024
{
if ( buf[status_or_nbytes-1] == 26 )
{
buf[status_or_nbytes-1] = '\0';
done = 1;
}

s += buf;
}
if (status_or_nbytes <= 0)
{
done = 1;
}

} while (!done);


if ( status_or_nbytes == -1 )
{
std::cout << "ERROR1" << std::endl;
return 0;
}
else
{
return 1;
}
}

最佳答案

您接收的 C 代码似乎做出了以下假设。

  • 数据以 1024 或更少的 block 形式到达
  • 每个 block 都以神奇的 26 结束
  • 如果 block 小于 1024,则通信结束

但这并不一定成立。操作系统可以在您的 recv(...) 调用中免费为您提供尽可能少的数据,即使流中仍有大量数据在等待您。音量越大,这种情况就越有可能。

一旦您收到少于 1024 字节的数据,服务器就会关闭连接并且 PHP 脚本会看到写入错误。

关于php - Unix 套接字发送接收客户端到服务器大块数据错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com