我需要使用 IrDA 套接字通信从设备发送命令和读取响应。尽管打包命令相当简单,但无法确定响应的预期大小。例如,命令“GET_ERRORS”会导致设备返回从0 到 n的数据, \n
每行最多 80 个字节的分隔行。我在这里阅读了帖子* ,但设备未向我提供 实际数据块 * 之前的 *** 标头。
[编辑]
这是 GET_ERRORS 命令的典型响应(为便于阅读而缩写):
Date Time Fault
10/12/2000 02:00:00 3f46
10/12/2000 02:00:00 bcf5
10/12/2000 02:00:00 1312
10/12/2000 02:00:00 a334
10/12/2000 02:00:00 b212
10/12/2000 02:00:00 b212
10/12/2000 02:00:00 c43a
%
如果我知道返回的数据长度,则此示例(来自 SO post HERE)效果很好:
int recv_all(int sockfd, void *buf, size_t len, int flags)
{
size_t toread = len;
char *bufptr = (char*) buf;
while (toread > 0)
{
ssize_t rsz = recv(sockfd, bufptr, toread, flags);
if (rsz <= 0)
return rsz; /* Error or other end closed cnnection */
toread -= rsz; /* Read less next time */
bufptr += rsz; /* Next buffer position to read into */
}
return len;
}
但是如果我想接收未知数量的数据,我唯一知道要做的就是声明一个大缓冲区,然后将它传递给这样的东西:
int IrdaCommReceive(int irdaCommSocket, void* largeBuf, size_t len, int* rcvd)
{
char *bufptr = (char *)largeBuf;
int bytesRcvd = recv(irdaCommSocket, bufptr, len, 0);
if (bytesRcvd < 0) return WSAGetLastError();
*rcvd = bytesRcvd;
return 0;
}
有没有更好的方法来为不确定大小的套接字数据编写接收函数?