[英]How to send a size_t variable with a TCP socket in C?
我正在研究将数据发送到TCP服务器的方法,但是首先应该将数据的大小发送8个字节。
也就是说,服务器将读取发送给它的前8个字节,并将其强制转换回size_t变量。 我的问题是,当文件大小不使用任何高位(即83 = 0000000S <-char,而不是十六进制)时,它仅发送非零字节。
这是我的方法:
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; }
}
}
您不能使用strlen()
确定二进制数据的长度。 一旦在length字段的二进制编码中看到零(NUL)字节,它将立即对数据进行错误计数。
写的比较“原始”函数,它接受所述数据的地址以及其作为参数的长度,例如
void write_to_server_raw(const void *message, size_t message_size) {
...
}
如果仍然需要发送NUL终止的字符串的功能,则可以重写现有的write_to_server()
函数,以便它调用新函数来完成实际工作。
void write_to_server_string(const char *message) {
size_t message_size = strlen(message);
write_to_server_raw(message, message_size);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.