Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Poco C+中复制缓冲区字节块+;?_C++_Sockets_Poco Libraries - Fatal编程技术网

C++ 如何在Poco C+中复制缓冲区字节块+;?

C++ 如何在Poco C+中复制缓冲区字节块+;?,c++,sockets,poco-libraries,C++,Sockets,Poco Libraries,嗨,我正在尝试在poco中编写TCP连接。客户端发送包含以下字段的数据包: packetSize:int 日期:int ID:int 因此,前4个字节包含数据包大小。在接收端,我有以下代码: int packetSize = 0; char *bufferHeader = new char[4]; // receive 4 bytes that contains packetsize here socket().receiveBytes(bufferHeader, sizeof(buffer

嗨,我正在尝试在poco中编写TCP连接。客户端发送包含以下字段的数据包:

packetSize:int
日期:int
ID:int

因此,前4个字节包含数据包大小。在接收端,我有以下代码:

int packetSize = 0;
char *bufferHeader = new char[4];

// receive 4 bytes that contains packetsize here
socket().receiveBytes(bufferHeader, sizeof(bufferHeader), MSG_WAITALL);

Poco::MemoryInputStream *inStreamHeader = new Poco::MemoryInputStream(bufferHeader, sizeof(bufferHeader));
Poco::BinaryReader *BinaryReaderHeader = new Poco::BinaryReader(*inStreamHeader);

(*BinaryReaderHeader) >> packetSize; // now we have the full packet size
现在,我尝试将所有剩余的传入字节存储到一个数组中,以便将来读取二进制:

int ID = 0;
int date = 0;
int availableBytes = 0;
int readedBytes = 0;
char *body = new char[packetSize - 4];

do
{
    char *bytes = new char[packetSize - 4];

    availableBytes = socket().receiveBytes(bytes, sizeof(bytes), MSG_WAITALL);

    if (availableBytes == 0)
        break;

    memcpy(body + readedBytes, bytes, availableBytes);

    readedBytes += availableBytes;

} while (availableBytes > 0);

Poco::MemoryInputStream *inStream = new Poco::MemoryInputStream(body, sizeof(body));
Poco::BinaryReader *BinaryReader = new Poco::BinaryReader(*inStream);

(*BinaryReader) >> date;
(*BinaryReader) >> ID;

cout << "date :" << date << endl;
cout << "ID :" << ID << endl;
intid=0;
int date=0;
int availableBytes=0;
int readedBytes=0;
char*body=新字符[packetSize-4];
做
{
char*bytes=新字符[packetSize-4];
availableBytes=socket();
如果(可用字节==0)
打破
memcpy(body+readedBytes、bytes、availableBytes);
readedBytes+=可用字节;
}而(可用字节>0);
Poco::MemoryInputStream*inStream=新Poco::MemoryInputStream(body,sizeof(body));
Poco::BinaryReader*BinaryReader=新Poco::BinaryReader(*流内);
(*二进制读取器)>>日期;
(*二进制读取器)>>ID;

我在你的代码中看到两个错误。或者,更准确地说,你犯了两次错误。 将
char[]
sizeof
char*
sizeof
混淆;第一个是数组中的字符数,第二个是指针的大小:通常为4或8字节,具体取决于内存型号

所以,当你写作的时候

availableBytes = socket().receiveBytes(bytes, sizeof(bytes), MSG_WAITALL);
您要求的是4(我想)字节。这并不严重,因为在消息完成之前,您会继续询问其他字节

真正的问题是下面的说明

Poco::MemoryInputStream *inStream = new Poco::MemoryInputStream(body, sizeof(body));
 char *bytes = new char[packetSize - 4];
您只传输
流内
中的
sizeof(char*)
字节

您应该将
sizeof(body)
sizeof(bytes)
替换为
packetSize-4

附言:对不起,我的英语不好

编辑:我看到另一个错误。在本说明中

Poco::MemoryInputStream *inStream = new Poco::MemoryInputStream(body, sizeof(body));
 char *bytes = new char[packetSize - 4];
您分配
packetSize-4
字符。此内存从未被删除,并在
do中分配。。。while()
循环

您可以在循环之外分配
字节
(与
正文一起分配)

编辑2016.03.17

建议的解决方案(注意:未经测试)

size\u t toRead=packetSize-4U;
尺寸t总读数=0U;
现在读取的大小;
char*body=新char[toRead];
做
{
nowRead+=socket().receiveBytes(body+totlead,toRead-totlead,
MSG_WAITALL);
如果(0==nowRead)
抛出std::runtime_错误(“从receiveBytes()关闭”);
totRead+=nowRead;
}而(totRead
感谢您的回复。是的,我对此感到困惑,毕竟当我将char*改为char[]时,我得到了完整的数据包。但实际上,当我尝试考虑缓冲区大小时,我不能调整char [],实际上C++不接受数组大小,它需要常数值,但它接受如下:<代码> char *缓冲器=新char(PACETSIZE)< /C> >,当我考虑char *时,每次只得到4字节,而不是完整的包。我怎样才能解决这个问题?@AmirHasanHesam:我认为你应该避免使用
sizeof()
;您拥有所需的字节数:使用它。您只能使用一个缓冲区。我将编辑我的答案以显示可能的解决方案。