2012-01-01 15 views
2

私はlinux envのソケットプログラミングの初心者です。linuxのソケットプログラミング:send()

void proccess_server(int s) 
{ 

    ssize_t size =0 ; 
    char buffer[1024]; 
    for(;;) 
    { 
     printf("proccess:%d proccessing socket :%d\n",getpid(),s); 
     size = recv(s,buffer,sizeof(buffer),0); 

     if(0 == size) 
      return ; 
     sprintf(buffer,"Response from server:%d,%d bytes altogether\n",getpid(),size); 

     send(s,buffer,strlen(buffer)+1,0); 
    } 

} 

と私は私を助けてくださいsend()len paramはsend(s,buffer,strlen(buffer)+1,0);

に別のバイト(strlen(buffer)+1)を追加する理由を理解していない:

コードです!

+0

このコードはすべて間違っていますが、どこに見つかりましたか?エラー状態(サイズ== -1)はチェックされず、 "バッファ"がチェックされずにヌルで終了すると予想されるため、セキュリティ上の欠陥があります。 – BatchyX

+0

...それは簡単なチュートリアルで、ネットワークプログラミングのAPI形式のテキストブックです。もし私がそれを修正したいのであれば、データを受け取る前にバッファを\ 0で埋めるべきでしょうか? –

+0

はい、sizeof(バッファ)を最大で-1バイトrecvする必要があります。 – BatchyX

答えて

2

C言語では、コンパイラはすべての文字列の末尾に\ 0(NULL)文字を置きます。文字列を使用している間、コンピュータはその文字列の終わりを理解できます。パスカル言語の例では、コンパイラは文字列の先頭に文字列の長さを格納します。

これは+1がある理由です。

+0

私は、文字列の最後に\ 0があることを理解しています。問題は+ 1は関数strlen()が\ 0を含まない文字列の長さを返すことを意味しますか? –

+0

はい、そうです。文字列が "abc"の場合、strlen( "abc")は3ですが、メモリ長は4です。 – tcak

+0

!ありがとう:> –

関連する問題