繁体   English   中英

如何在C中使用TCP套接字发送size_t变量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM