コマンドを送信し、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 の投稿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;
}
不確定なサイズのソケット データの受信関数を作成するより良い方法はありますか?