runnungの間に私たちのアップデータソフトウェアとやりとりするプログラムを書きました。基本的にステータスを求めて、それを遠くから殺すことができる。そうするために、プログラムはhost-ipと、コマンドラインを使って起動するときにコマンドを取得します。このようなもの:最後に起動したargv残りの部分
./updater_killer <host_name> die
これ自体は問題ありません。しかし、私は長いコマンドを使用して、短い方との第2の起動を行うよりも、最初のコマンドの残りの部分は、第1にいっぱいになったとき:
./updater_killer <host_name> status
./updater_killer <host_name> die
最初のものは正常に動作します。しかし、1秒間私は、次のメッセージが表示されます:
は私も長く、次の開始aswellの上に残ったものの他の部分とのコマンドでそれを試してみました。
これは、接続を確立した後にargv[2]
を使用してコマンドを送信する部分です。
if (send(sockfd, argv[2], strlen(argv[2]), 0) == -1)
perror("send");
私はargv[2]
を変更することはありません。私はすべてそれを送信するためにstring
または*char
に保存しようとしました。しかしそれ以外は役に立たなかった。私はそれがメモリについて何かであり、まだ割り当てられていると仮定しました。しかし、私はプログラムの次の開始のために無料でargv
beforのためにどのような考えがありません。
プログラムの次の開始時に最後のコマンドから残りの部分を取り除くには、何が必要ですか?
編集:私は受信機側でこれを固定EJPからの回答では
:それは動作するようになりましbuf[numbytes] = '\0';
で
if ((numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
。私がnumbytes
に頼ることができるなら、私はジェットshureではありません。
私は、受信者がソケットから読み取られたデータがヌルで終了する文字列であると推測しています。送信された 'send()'コードは、送られたデータをnul終わらせないことに注意してください。 –
@AndrewHenle受信者が想定している場合は、 'recv()'が返されるとすぐに処理を進めるのではなく、nullを取得するまで読み込むべきです。 – EJP
助けてくれてありがとう。私はレシーバーの側でそれを変更しました(そして、それを編集して、他の人が私が何をしたかを知るための質問にしました)。しかし、私は 'これは必ずしもrecv()によって返される値と同じではない。 'それ以外はrecv()が0またはバイト数の代わりに何を返すか? – DocRattie