【发布时间】:2018-05-07 16:42:26
【问题描述】:
我正在处理将数据发送到 TCP 服务器的东西,但首先它应该以 8 个字节发送数据的大小。
也就是说,服务器将读取发送给它的前 8 个字节并将它们转换回 size_t 变量。我的问题是,当文件大小不使用任何最高位(即 83 = 0000000S
这就是我的做法:
void send_file_to_server(char *filename){
struct stat buf;
if (stat(filename, &buf)==-1){ exit(1); }
size_t file_size = buf.st_size;
char *filesize_string = calloc(1, 8);
filesize_string = (char*)&file_size;
//this function actually writes to the server
write_to_server((char*) filesize_string);
// will be code later on that sends the actual file using write_to_server()
}
传递给我的 write_to_server() 函数的 char* 有一些奇怪的行为:它只将其识别为大小为 6 的字符串,并且在传入之前就被扭曲了。感谢任何有关如何使这项工作的建议.
注意:我不必担心字节顺序(htonl 等)或 size_t 的不同大小,因为这适用于只能在特定 VM 上运行的项目。
编辑:
这是另一个函数:
void write_to_server(char *message){
ssize_t bytes_sent = 0;
ssize_t message_size = strlen(message);
while ( bytes_sent < message_size ){
ssize_t ret = write(server_socket, message+bytes_sent, message_size-bytes_sent);
if (ret==0){
print_connection_closed();
exit(1);
}
if (ret==-1 && (errno!=EINTR || errno!=EAGAIN)){
printf("write failed: sent %zd bytes out of %zd\n", bytes_sent, message_size);
exit(1);
}
if (ret!=-1){ bytes_sent+=ret; }
}
}
【问题讨论】:
-
我的问题是,当文件大小不使用任何最高位时 - 所以这是一个错误的逻辑。使用正确的发送所有数据的方法。零是有意义的..
-
calloc调用的目的是什么?它似乎所做的只是泄漏内存。 -
您将
filesize_string变量的地址传递给write_to_server函数。我怀疑你真的想传递file_size变量的地址,或者filesize_string变量的值。 -
你应该好好利用
sizeof(size_t)而不是将其硬编码为8 -
@Ian Abbott 它是为了获取已经设置为 0 的内存。所以字符串的高字节已经是 0。是的,我想我没有显示它是免费的。
标签: c sockets tcp network-programming