0

Linuxでacプログラムに取り組んでいます。クライアント サーバー プログラミングを使用する必要があります。私は読み書きを使用しましたが、うまくいきました。しかし、サーバーとクライアントの両方で 20 回以上の読み取りと書き込みを行った後、機能しなくなりました。つまり、そのための出力を受け取りません。ライン。まったく同じ回線を使用しているため、何が問題なのかわかりません。

bzero(&hl,200);
read(a,hl,50*sizeof(char));
printf("%s",hl);

クライアント側では、

bzero(&hl,200);
strcpy(hl,"hello");
write(a,hl,50*sizeof(char));
printf("%s",hl);

また、戻り値を取得して印刷することもできません。debian で使用しているうちに、戻り値が得られ、印刷できました。今、Ubuntuにいます(自宅)。現在、戻り値を出力していません。エラーもありません!OSとか関係ない?

問題を解決するのを手伝ってください。

更新しました:

サーバーでは、

int c: s=read(a,&c,sizeof(int)); printf("選択: %d",c);

クライアントでは、

scanf("%d",&ch); s=write(sd,&ch,sizeof(int));

どちらもサイズは 4 です。しかし、クライアントでは、選択肢を印刷しているときにガベージ値を取得しました。

4

1 に答える 1

1

の戻り値を破棄するreadため、読み取ったバイト数がわかりません。50未満の場合はどうなりますか?

変化する:

read(a,hl,50*sizeof(char));

に:

int readBytes = 0;
do
{
    int r = read(a, hl + readBytes, 50 - readBytes);
    if (r <= 0)
        return; // or however you want to handle an error
    readBytes += r;
} while (readBytes < 50);

これにより、実際に50バイトを読み取ることができます。

あなたはTCPがどういうわけかそれらの50バイトを一緒に「接着」することを想像しています。しかし、システムはそれらの50バイトがメッセージであることを認識していません-あなたのコードだけがそうします。したがって、それらを接着するのはコードの仕事です。TCPは、アプリケーションメッセージの境界を保持しません。これがアプリケーションの仕事です。

于 2012-12-03T11:43:46.050 に答える