1

私は C ソケット プログラミングは初めてで、クライアントがテキスト ファイル (46 MB) から部分的なデータを読み取ってサーバーに送信するサーバー/クライアント アプリケーションを構築したいと考えています。ファイルをコンソールに。

私はこれをすべて間違っていますか?サーバーは現時点で空白行をコンソールに出力します。理由がわかりませんでした:/

クライアントは次のとおりです。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

void error(char *msg) {
  perror(msg);
  exit(1);
}

int main( int argc , char *argv[] ) {
  int sockfd , port_no , n;
  struct sockaddr_in server_addr;
  struct hostent *server;
  char buffer[256];
  FILE *fp;

  if(argc < 3) {
    fprintf(stderr , "usage %s hostname port" , argv[0] );
    exit(0);
  }

  port_no = atoi( argv[2] );
  sockfd = socket( AF_INET , SOCK_STREAM , 0);
  if( sockfd < 0 )
    error("ERROR opening socket");

  server = gethostbyname(argv[1]);
  if( server == NULL ) {
    fprintf(stderr , "ERROR, no such host.");
    exit(0);
  }

  bzero( (char *) &server_addr , sizeof(server_addr) );
  server_addr.sin_family = AF_INET;
  bcopy( (char *)server -> h_addr , (char *) &server_addr.sin_addr.s_addr , server -> h_length );
  server_addr.sin_port = htons(port_no);

  if( connect( sockfd , (char *) &server_addr , sizeof(server_addr)) < 0 ) {
    error("ERROR , connecting");
  }

  bzero(buffer , 256); 


  if( (fp = fopen("text.txt" , 'r')) != NULL ) {
    while(1) {
      if( (fgets(buffer , 255 , fp)) != NULL ) {
        n = write( sockfd , buffer , strlen(buffer) );
        if( n < 0 ) {
          error("ERROR writing to socket");
        }
      }
    }
    fclose(fp);
  }

}

サーバーは次のとおりです。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(char *msg) {
  perror(msg);
  exit(1);
}

int main(int argc , char *argv[]) {
  int sockfd , newsockfd , port_no , cli_length , n; 
  char buffer[256];
  struct sockaddr_in server_addr , client_addr;

  if(argc < 2) {
    fprintf(stderr , "ERROR , no port provided!");
    exit(1);
  }

  sockfd = socket(AF_INET , SOCK_STREAM , 0);

  if( sockfd < 0 )
    error("ERROR opening socket.");

  bzero( (char *) &server_addr , sizeof(server_addr) );
  port_no = atoi(argv[1]);

  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons( port_no );       
  server_addr.sin_addr.s_addr = INADDR_ANY;

  if( bind( sockfd , (struct sockaddr *) &server_addr , sizeof(server_addr)) < 0 ) {
    error("ERROR on binding.");
  }

  listen(sockfd , 5);

  cli_length = sizeof(&client_addr);
  newsockfd = accept( sockfd , (struct sockaddr *) &client_addr , &cli_length );
  if (newsockfd < 0 )
    error("ERROR on accept.");

  bzero(buffer , 256);
  while(1) {
    n = read(newsockfd , buffer , 255);
    if( n < 0 ) {
      error("ERROR reading from socket");
    }
    printf(" %s " , buffer);
  }


}
4

1 に答える 1

1

あなたの問題は、バッファの NULL 終了にあると思います。試す

printf( "%.256s" , buffer );

バッファーに正当な \0 文字を含めることができる場合は、一度に 1 文字ずつ出力してみます。

{ 
   for (int i=0; i<256; i++)
       printf("%c" , buffer[i]);
}

ヨアキム

于 2012-10-24T22:37:18.077 に答える