(TCP) ソケットを介したデータ転送で小さな問題が発生しました。私がやっていることの小さな背景:
A 側から B 側にデータを送信しています。最大サイズが 1096 バイトであると仮定すると、送信されるデータは可変長にすることができます。
A) send(clientFd, buffer, size, NULL)
B では、予想されるサイズがわからないため、常に 1096 バイトを受信しようとします。
B) int receivedBytes = receive(fd, msgBuff, 1096, NULL)
ただし、これを行ったとき: A がデータの小さなチャンクを送信していることに気付きました..たとえば、約 80 ~ 90 バイトです。数回の送信バーストの後、B はそれらを組み合わせて receiveBytes を 1096 にしました。これにより明らかにデータが破損し、地獄が解き放たれました。
これを修正するために、データをヘッダーとデータの 2 つの部分に分けました。
struct IpcMsg
{
long msgType;
int devId;
uint32_t senderId;
uint16_t size;
uint8_t value[IPC_VALUES_SIZE];
};
A面:
A) send(clientFd, buffer, size, NULL)
B では、最初にヘッダーを受信し、受信するペイロードのサイズを決定します。次に、残りのペイロードを受信します。
B) int receivedBytes = receive(fd, msgBuff, sizeof(IpcMsg) - sizeof( ((IpcMsg*)0)->value ), 0);
int sizeToPoll = ((IpcMsg*)buffer)->size;
printf("Size to poll: %d\n", sizeToPoll);
if (sizeToPoll != 0)
{
bytesRead = recv(clientFd, buffer + receivedBytes, sizeToPoll, 0);
}
そのため、ペイロードを持つ送信ごとに、受信を 2 回呼び出すことになります。これは私にとってはうまくいきましたが、これを行うためのより良い方法があるかどうか疑問に思っていましたか?