c - C 中从 'int*' 到 'off_t*' 的转换无效?

标签 c

我正在编写一个程序,该程序将使用套接字通过网络将一个文件发送到使用 C 的另一个程序。但是,我遇到了障碍,并且由于我对 C 相当陌生,因此无法解决它。当尝试编译时,我收到此错误:

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)){

我不明白出了什么问题。非常感谢所有帮助。谢谢:)

文件:

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);

}

最佳答案

您需要知道sendfile()函数采用什么参数类型。 请参阅sendfile() man page.

请注意,您调用 offset 的第三个参数的类型为 off_t *。确保您传入的是 off_t 类型的指针,这样您的错误就会得到修复。

因此,不要将偏移量定义为:

int 偏移量;

尝试

off_t 偏移量;

关于c - C 中从 'int*' 到 'off_t*' 的转换无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39129394/

相关文章:

c++ - 将 64 位循环拆分为多个整数上的 32 位循环

c - C89和C99性能差异

c - 为什么 strcmp 对完整填充的字符数组给出不同的响应?

c - C中不输入任何字符

c - 无法在一行中打印 5 个整数

python - 将 numpy 数组传递给 cython 中的 C 函数

尽可能快地比较缓冲区

c - 无法将嵌套 if 转换为 if(condition1 || condition2)

c++ - 如何实际使用 AddressSanitizer 和 MemorySanitizer?

c - 在 C 中排序后跟踪数组的原始索引