-2

クライアントサーバーモデルにこれらのループがありますが、クライアントコードのこれらのループは、ファイルが0またはEOFになるまでファイルから読み取ることですが、条件が真であってもループに入ることはありません???

int n_read;

while ( (   n_read=((read(sockfd,&buffer,sizeof(buffer))))>0    )   );
{
    printf("test to print\n");
    write(fd,buffer,strlen(buffer));
    //bzero(&buffer,sizeof(buffer));


}

そして奇妙なことは、ファイルから読み書きするためにサーバーコードに同じループがあり、その作業は完璧ですが、クライアントでサーバーとして機能しない理由がわかりません???

サーバーループコードは次のとおりです。

while (( read(fd,buffer,sizeof(buffer)))>0) /* to read from open file descriptor */
                         {
                            n=write(connfd,&buffer,n);
                             if(n<0){error("Error,Reading from socket \n");}     
                            {buffer[n] = '\0';}
                         }

では、この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

クライアント コードの行末にセミコロンがあります。

while ( (   n_read=((read(sockfd,&buffer,sizeof(buffer))))>0    )   );
                                                                     ^

それはループ全体を考えることです。次のコードは、false になるまで実行せず、失敗する前に 1 回だけ実行します。

また、括弧で少し頭がおかしくなりました。あなたはそれを減らすことができます

while ((n_read = read(sockfd, &buffer, sizeof(buffer))) > 0)
于 2013-10-22T23:10:55.213 に答える
0

アドバイス: 「;」を入れないでください (セミコロン) while/for ループが右括弧に寄り添った後。セミコロンを独自の行に配置するか、各ループの後に {} (中かっこ) を配置するコーディング スタイルが本当に必要です。

この問題だけを回避するために、寄り添うアプローチを好む人もいます。

loop キーワードの下の {} と、行末の clean ) を好みます。

両方のプログラムで buffer の宣言を表示してください。1 つは &buffer (バッファーのアドレス) を提供し、もう 1 つはバッファーのみを提供します。おそらく、バッファーは既にポインターまたは配列として宣言されているため、「&」が問題を引き起こしています。

ソケットはバイナリを喜んで運ぶため、受け取った cstring を確実に終了させたい場合があります。たとえば、

int n_read;
while ( (n_read=read(sockfd,&buffer,sizeof(buffer))) >0 )
{
    buffer[n_read]='\0';
    printf("test to print, %s\n",buffer);
    write(fd,buffer,strlen(buffer));
}
于 2013-10-23T01:35:02.167 に答える