Qt を使用して、長さ優先の TCP メッセージを操作しようとしています。私は次の方法を持っています:
QByteArray con::read()
{
QByteArray s;
s = _pSocket->read(4);
if (s.length() == 4) {
int size = char_to_int32(s);
s = _pSocket->read(size);
}
return s;
}
まあ、うまくいきません。最初の 4 バイトを読み取った後、すべてのデータを失ったようです。最初の読み取りは正常に機能しますが、read(size)
何も返されません。これを解決する方法はありますか?
char_to_int32 は次のとおりです。
int char_to_int32(QByteArray s)
{
int size = 0;
size |= (s.at(0) << 24);
size |= (s.at(1) << 16);
size |= (s.at(2) << 8);
size |= (s.at(3));
return size;
}
編集 :
送信関数 (プレーン C):
int send(int connfd, const unsigned char* message, unsigned int size) {
int c;
unsigned char* bytes = (unsigned char*) malloc(4 + size);
int32_to_char(size, bytes); // converts message size to 4 bytes
memcpy(bytes + 4, message, size);
c = write(connfd, bytes, 4 + size);
free(bytes);
if (c <= 0)
return -1;
else
return 0;
}
ちなみに、_pSocket->readAll() を呼び出すと、4 バイトのサイズとメッセージ自体を含むパケット全体が読み取られます。
編集 :
void int32_to_char(uint32_t in, char* bytes) {
bytes[0] = (in >> 24) & 0xFF;
bytes[1] = (in >> 16) & 0xFF;
bytes[2] = (in >> 8) & 0xFF;
bytes[3] = in & 0xFF;
return;
}