从';int*';至';off_t*';在C中?
我正在编写一个程序,它将使用套接字通过网络将一个文件发送到另一个使用C的程序。然而,我遇到了一个障碍,因为我对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 ((
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*
。确保您正在传入一个指向typeoff\t
的指针,您的错误将得到修复
因此,不要将偏移定义为:
int偏移量代码>
试一试
off\t offset代码>Makeoffset
along 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);