0

Linux サーバー クライアントから Linux ソケット クライアントに .txt ファイルを送信しようとしています (ループバック インターフェイスを使用しています)。「OK」などの文字列を送信しようとしましたが、すべてうまくいきましたが、ファイルを送信しようとすると、クライアントが奇妙な出力を出力します。明らかに、ソケット、接続、受け入れ、リッスンなどの前のすべての手順を実行しました。

これはサーバー側のコードです:

printf("Sending file\n);
if ((fp=fopen(filename, "r"))!=NULL){
   while ( (nbytes = fread(sendline, sizeof(char), 512, fp) > 0)){
        printf("%s\n",sendline);
        sent = writen(clientfd, sendline, nbytes);
    }
   close(fp);
}else
    perror("Open file");

「書き込み」機能は次のとおりです。

ssize_t writen(int fd, const void *vptr, size_t n){
/* Write "n" bytes to a descriptor. */
size_t      nleft;
ssize_t     nwritten;
const char  *ptr;

ptr = vptr;
nleft = n;
while (nleft > 0) {
    if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
        if (nwritten < 0 && errno == EINTR)
            nwritten = 0;       /* and call write() again */
        else
            return(-1);         /* error */
    }

    nleft -= nwritten;
    ptr   += nwritten;
}
return(n);
}

クライアント側のコードは次のとおりです。

   while (fgets(sendline, 10000,stdin) != NULL)
{
  sendto(sockfd,sendline,strlen(sendline),0,
         (struct sockaddr *)&servaddr,sizeof(servaddr));
  read(sockfd,recvline,10000);
  fputs(recvline,stdout);
  recvline[n]=0;
  if((recvline[0]=='-')&&(recvline[1]=='E')&&(recvline[2]=='R')&&(recvline[3]=='R')){
      close(sockfd);
      exit(1);
  }

}

私が手に入れた奇妙なクライアントはイメージにあります。 クライアント出力

それで、私の間違いは何ですか?このような出力が表示されるのはなぜですか?どうすれば修正できますか?

4

2 に答える 2

1

read返されたバイト数 (または失敗したかどうか) を確認することはありません。想定どおりに n バイトが返されたとしても、出力するまでバッファを null で終了しないためfputs(recvline,stdout)、スタック上の初期化されていないバッファで見つかったガベージが出力されます。

于 2013-06-14T18:28:32.873 に答える
1

いくつかの問題、

サーバー コードでは、括弧の位置が正しくありません。

while ( (nbytes = fread(sendline, sizeof(char), 512, fp) > 0)){

する必要があります

while ( (nbytes = fread(sendline, sizeof(char), 512, fp)) > 0){
                                               ---------^ parenthesis close here

クライアント側では、印刷する前に次のように設定'\0'しますrecvline

n = read(sockfd,recvline,10000);
recvline[n] = '\0'
fputs(recvline,stdout);
于 2013-06-14T18:30:09.090 に答える