从';int*';至';off_t*';在C中?

从';int*';至';off_t*';在C中?,c,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 ((

我正在编写一个程序,它将使用套接字通过网络将一个文件发送到另一个使用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发送者(){
int-server_-socket;
int peer_插座;
socklen_u t socklen;
西泽特伦;
服务器地址中的结构sockaddr\u;
对等地址中的结构sockaddr\u;
int-fd;
int发送字节=0;
字符文件大小[256];
结构统计文件_stat;
整数偏移量;
int-u数据;
/*创建服务器套接字*/
服务器\u套接字=套接字(AF\u INET,SOCK\u STREAM,0);
如果(服务器_套接字==-1){
fprintf(stderr,“创建套接字-->%s时出错”,strerror(errno));
退出(退出失败);
}
/*归零服务器地址结构*/
memset(&server_addr,0,sizeof(server_addr));
/*构造服务器地址结构*/
服务器地址sin家庭=AF网络;
inet_pton(AF_inet、服务器地址和(服务器地址sin_addr));
服务器地址sin\u端口=htons(端口号);
/*束缚*/
if((bind(server_socket,(struct sockaddr*)和server_addr,sizeof(struct sockaddr)))=-1){
fprintf(stderr,“绑定时出错-->%s”,strerror(errno));
退出(退出失败);
}
/*侦听传入连接*/
if((侦听(服务器_套接字,5))=-1){
fprintf(stderr,“侦听时出错-->%s”,strerror(errno));
退出(退出失败);
}
fd=打开(仅发送文件);
如果(fd==-1){
fprintf(stderr,“打开文件-->%s时出错”,strerror(errno));
退出(退出失败);
}
/*获取文件统计信息*/
如果(fstat(fd,&file_stat)<0){
fprintf(stderr,“错误fstat-->%s”,strerror(errno));
退出(退出失败);
}
fprintf(标准输出,“文件大小:\n%ld字节\n”,文件统计.st\u大小);
sock_len=sizeof(结构sockaddr_in);
/*接受传入的对等方*/
peer\u socket=accept(服务器\u socket,(结构sockaddr*)和peer\u addr,&sock\len);
如果(对等\u套接字==-1){
fprintf(stderr,“接受时出错-->%s”,strerror(errno));
退出(退出失败);
}
fprintf(stdout,“接受对等-->%s\n”,inet_ntoa(对等地址sin_addr));
sprintf(文件大小,“%ld”,文件统计.st\u大小);
/*发送文件大小*/
len=send(对等套接字,文件大小,sizeof(文件大小),0);
if(len<0){
fprintf(stderr,“发送问候语时出错-->%s”,strerror(errno));
退出(退出失败);
}
fprintf(stdout,“服务器发送了%d字节的大小,\n”,len);
偏移量=0;
保留数据=文件统计数据大小;
/*发送文件数据*/
而((发送字节=发送文件(对等套接字、fd和偏移量、BUFSIZ))>0)和(保留数据>0)){
fprintf(标准输出,“1.服务器从文件数据发送了%d字节,偏移量现在为:%d,剩余数据=%d\n”,已发送字节,偏移量,剩余数据);
剩余数据-=已发送字节;
fprintf(标准输出,“2.服务器从文件数据发送了%d字节,偏移量现在为:%d,剩余数据=%d\n”,已发送字节,偏移量,剩余数据);
}
关闭(对等接口);
关闭(服务器_套接字);

}

您需要知道
sendfile()
函数的参数类型。 看

请注意,您调用的第三个参数offset的类型为
off\u t*
。确保您正在传入一个指向type
off\t
的指针,您的错误将得到修复

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

int偏移量

试一试


off\t offset

Make
offset
a
long int
off\u t
?警告非常明确:您正在导致未定义的行为。问题所在也很清楚,只需替换
int offset带有
关闭偏移量。信息非常清楚。您有不兼容的指针类型,转换将调用未定义的行为。你的具体问题是什么?@JosephYoung:这可能会在代码的其他地方造成问题。
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);