2016-08-24 16 views
-2

私は、Cを使ってソケットを使って別のプログラムにネットワークを介して1つのファイルを送るプログラムを書いています。しかし、私はロードブロックを打ちました。コンパイルしようとすると、私はこのエラーになります:Cの 'int *'から 'off_t *'への無効な変換ですか?

data_logger.c: In function ‘void sender()’: 
data_logger.c:163:72: error: invalid conversion from ‘int*’ to ‘off_t* {aka long int*}’ [-fpermissive] 
    while (((sent_bytes = sendfile(peer_socket, fd, &offset, BUFSIZ)) > 0) && (remain_data > 0)){ 

私は何が間違っているのか理解できません。すべての援助は非常に高く評価されます。感謝:)

ファイル:あなたはsendfile()機能が必要なものを、パラメータの種類を知る必要があり

void sender(){ 

    int server_socket; 
    int peer_socket; 
    socklen_t  sock_len; 
    ssize_t len; 
    struct sockaddr_in  server_addr; 
    struct sockaddr_in  peer_addr; 
    int fd; 
    int sent_bytes = 0; 
    char file_size[256]; 
    struct stat file_stat; 
    int offset; 
    int remain_data; 

    /* Create server socket */ 
    server_socket = socket(AF_INET, SOCK_STREAM, 0); 

    if (server_socket == -1){ 
      fprintf(stderr, "Error creating socket --> %s", strerror(errno)); 
      exit(EXIT_FAILURE); 
    } 

    /* Zeroing server_addr struct */ 
    memset(&server_addr, 0, sizeof(server_addr)); 

    /* Construct server_addr struct */ 
    server_addr.sin_family = AF_INET; 
    inet_pton(AF_INET, SERVER_ADDRESS, &(server_addr.sin_addr)); 
    server_addr.sin_port = htons(PORT_NUMBER); 

    /* Bind */ 
    if ((bind(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) == -1){ 
      fprintf(stderr, "Error on bind --> %s", strerror(errno)); 
      exit(EXIT_FAILURE); 
    } 

    /* Listening to incoming connections */ 
    if ((listen(server_socket, 5)) == -1){ 
      fprintf(stderr, "Error on listen --> %s", strerror(errno)); 
      exit(EXIT_FAILURE); 
    } 

    fd = open(FILE_TO_SEND, O_RDONLY); 

    if (fd == -1){ 
      fprintf(stderr, "Error opening file --> %s", strerror(errno)); 
      exit(EXIT_FAILURE); 
    } 

    /* Get file stats */ 
    if (fstat(fd, &file_stat) < 0){ 
      fprintf(stderr, "Error fstat --> %s", strerror(errno)); 
      exit(EXIT_FAILURE); 
    } 

    fprintf(stdout, "File Size: \n%ld bytes\n", file_stat.st_size); 

    sock_len = sizeof(struct sockaddr_in); 

    /* Accepting incoming peers */ 
    peer_socket = accept(server_socket, (struct sockaddr *)&peer_addr, &sock_len); 
    if (peer_socket == -1){ 
      fprintf(stderr, "Error on accept --> %s", strerror(errno)); 
      exit(EXIT_FAILURE); 
    } 
    fprintf(stdout, "Accept peer --> %s\n", inet_ntoa(peer_addr.sin_addr)); 

    sprintf(file_size, "%ld", file_stat.st_size); 

    /* Sending file size */ 
    len = send(peer_socket, file_size, sizeof(file_size), 0); 

    if (len < 0){ 
      fprintf(stderr, "Error on sending greetings --> %s", strerror(errno)); 
      exit(EXIT_FAILURE); 
    } 

    fprintf(stdout, "Server sent %d bytes for the size\n", len); 

    offset = 0; 
    remain_data = file_stat.st_size; 

    /* Sending file data */ 
    while (((sent_bytes = sendfile(peer_socket, fd, &offset, BUFSIZ)) > 0) && (remain_data > 0)){ 
      fprintf(stdout, "1. Server sent %d bytes from file's data, offset is now : %d and remaining data = %d\n", sent_bytes, offset, remain_data); 
      remain_data -= sent_bytes; 
      fprintf(stdout, "2. Server sent %d bytes from file's data, offset is now : %d and remaining data = %d\n", sent_bytes, offset, remain_data); 
    } 

    close(peer_socket); 
    close(server_socket); 

}

+1

メイクを試してみてください '? –

+2

警告はかなり明確です:あなたは未定義の動作を引き起こしています。問題がどこであるかは明らかで、 'int offset;'を 'off_t offset;'に置き換えるだけでいいです。 – EOF

+0

メッセージは非常に明確です。互換性のないポインタ型があり、変換によって未定義のビヘイビアが呼び出されます。あなたの**具体的な**問題は何ですか? – Olaf

答えて

1

。 参照sendfile() man page.

オフセットを呼び出す3番目のパラメータは、off_t *であることに注意してください。入力したポインタがoff_tであることを確認してください。エラーが修正されます。

ので、代わりのようにオフセットの定義:

int offset;

は `長いint`または` off_t`・オフセット

off_t offset;

関連する問題