我在通过(TCP)套接字传输数据时遇到了一个小问题。我在做什么的小背景:
我正在从 A 侧向 B 发送数据。发送的数据可以是可变长度,假设最大大小为 1096 字节。
A) send(clientFd, buffer, size, NULL)
在 B 上,由于我不知道预期的大小,我总是尝试接收 1096 字节:
B) int receivedBytes = receive(fd, msgBuff, 1096, NULL)
但是,当我这样做时:我意识到 A 正在发送小块数据......比如说大约 80-90 个字节。在几次发送之后,B 将它们组合在一起,接收到的字节数为 1096。这显然是损坏的数据和地狱般的松动。
为了解决这个问题,我将数据分成两部分:标题和数据。
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);
}
所以,对于每一个有有效载荷的发送,我最终都会调用接收两次。这对我有用,但我想知道是否有更好的方法来做到这一点?