Unix套接字发送接收客户端到服务器大块数据错误
Unix socket send receive client to server big chunk of data error
我在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] = ' ';
done = 1;
}
s += buf;
}
else if ( status_or_nbytes > 0 ) // < 1024
{
if ( buf[status_or_nbytes-1] == 26 )
{
buf[status_or_nbytes-1] = ' ';
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 或更少的块形式到达
- 每个块都由一个神奇的 26 终止
- 如果块小于 1024,则发生通信结束
然而,这不一定成立。操作系统可以在您的recv(...)
通话中免费为您提供尽可能少的数据,即使流中仍有大量数据在等着您。交易量越高,这种情况的可能性就越大。
一旦您收到少于 1024 字节,服务器将关闭连接,PHP 脚本将看到写入错误。
相关文章:
- 将相机数据从服务器实时流式传输到客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- Arduino UNO+SIM800L-向服务器发送数据
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- Java 客户端C++服务器数据发送/接收问题
- QTcpSocket 在 RemoteHostClosedError 后重新连接到服务器时无法传输数据
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- 如何在C++中使用带有SFML的http reqest从节点.js服务器获取数据?
- 在 MySQL 中运行 HTTP 服务器以从客户端接收数据
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 如何使用 asio 本地数据报构建回显服务器和客户端?
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 通过TCP将数据从C++客户端发送到JSON服务器
- 如何使客户端在将数据写入 C++ 管道之前检查服务器是否完成了从管道的读取操作
- C++中从客户端到服务器的数据传输问题
- 可视化 将 TCP 服务器数据包保存到 C++ 中的文件
- 客户端(cocos2d-x) <-> 服务器(php) 如何将服务器数据发送回 Cleint?