2016-06-14 7 views
0

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ではありません。

答えて

3

受信者は、recv()によって返された長さをはっきりと無視しています。しかし、あなたはまた、send()の1つがrecv()であると仮定していますが、これは真ではありません。あなたはアプリケーションプロトコルを考案する必要があります。受信者にメッセージ内のどのくらいのデータを期待するかを示す長さプレフィックス。これはではなく、recv()によって返された値と同じでなければなりません。

+1

私は、受信者がソケットから読み取られたデータがヌルで終了する文字列であると推測しています。送信された 'send()'コードは、送られたデータをnul終わらせないことに注意してください。 –

+1

@AndrewHenle受信者が想定している場合は、 'recv()'が返されるとすぐに処理を進めるのではなく、nullを取得するまで読み込むべきです。 – EJP

+0

助けてくれてありがとう。私はレシーバーの側でそれを変更しました(そして、それを編集して、他の人が私が何をしたかを知るための質問にしました)。しかし、私は 'これは必ずしもrecv()によって返される値と同じではない。 'それ以外はrecv()が0またはバイト数の代わりに何を返すか? – DocRattie

関連する問題