今考えているのは、
① 別PCからソケットでコマンドを送信
変数 : Length, command
② 本サーバーが
変数 : Length, command
を受けて、以下のC++を実行
③ C++は、制御機器にソケットでコマンドを送信して、データを受信する。
ソースは、下に載せます。
いま問題になっているのが③の制御機器にコマンドを送信する部分です。
main()
のcommand(length, com) // 一番下の行
の部分で、返りの長さが決まっているコマンドに関しては、
変数 : 7(=Length), -get version(=command)を受信して
command(7, "-get version")
とすれば問題なく帰ってくるのですが、
lengthのところにsizeof(int)
が入っているコマンド(実際に動くサンプルが手元にありそれを元に作りかえております)があり、
これの理解が出来ていなくて困っております。
sizeof(int)が、int型のメモリサイズを返すものというのは調べれば出てくるのですが、
わたしのプログラムの場合、どういう事になっているのかが分かりません。
例)command(sizeof(int), "-reset")
コマンドごとに決まっているので、
変数 : -1(=Length), -reset(=command)
if (Length = -1) length = sizeof(int);
を付け足して、場合分けをすれば上手くいくのかなとも思うのですが
私の知識不足でどういう意味か分からず完成させるのもと思い
詳しい方がいらっしゃいましたらお教えいただきたいと思い、質問させていただきました。
必要な情報のご指摘があれば、更新させていただきます。
どうぞよろしくお願いいたします。
C++
// グローバル変数 const int socketBufferSize = 6*1280*sizeof(int); char socketBuffer[socketBufferSize]; // コマンド送信 bool send(const char *message, va_list args) { memset(socketBuffer, 0, socketBufferSize); // バッファのクリア vsprintf(socketBuffer, message, args); // コマンドをバッファに出力 int n; if (!tcp) n = sendto(sockfd, socketBuffer, strlen(socketBuffer), 0, (struct sockaddr*) &serverName, sizeof (serverName)); else n = send(sockfd, socketBuffer, strlen(socketBuffer), 0); if (debug) printf("%i bytes sent: %s\n", n, socketBuffer); if (n < 0) { printf("Error: Could not send command\n"); return false; } return true; } // 応答を受信してバッファに保存 bool receive(int length) { if (length > socketBufferSize) { printf("Error: Socket buffer too small\n"); return false; } struct sockaddr_in addrRemote; unsigned int cbAddr = sizeof(addrRemote); memset(socketBuffer, 0, socketBufferSize); // バッファのクリア int responseLength = 0, n, readMax; while (true) // 読み取り(応答の長さが読み取られるまで)、応答が複数のパケットに分けられる可能性あり { readMax = length - responseLength; // 読み取る残りのサイズ if (!tcp) n = recvfrom(sockfd, socketBuffer + responseLength, readMax, 0, (struct sockaddr *) &addrRemote, &cbAddr); else n = recv(sockfd, socketBuffer + responseLength, readMax, 0); if (n <= 0) { printf("Error: Could not receive response\n"); return false; } responseLength += n; if (responseLength == 4 /*Server returned error code*/ || responseLength == length) break; } if (responseLength == 4 && getInteger(0) < 0) { printf(">>>> Error: Received error code %i\n", getInteger(0)); return false; } if (debug) printf("%i bytes received\n", responseLength); return true; } bool command(int recvLength, const char *command, ...) // recvLength: 応答のサイズ { bool result; va_list args; va_start(args, command); result = send(command, args); if (result) result = receive(recvLength); va_end(args); return result; } int main(int argc, char** argv) { for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], "-debug")) debug = true; if (!strcmp(argv[i], "-host")) sprintf(host, argv[++i]); if (!strcmp(argv[i], "-port")) port = atoi(argv[++i]); if (!strcmp(argv[i], "-udp")) tcp = false; } // socket通信の設定 if (!init()) return -1; // 機器にコマンド送信 length = argv[1]; com = argv[2]; command(length, com); printf("version %s\n", socketBuffer); }
まだ回答がついていません
会員登録して回答してみよう