Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在哪里可以找到off\t类型的完整定义?_C_Sockets_Networking_Types_Header Files - Fatal编程技术网

C 在哪里可以找到off\t类型的完整定义?

C 在哪里可以找到off\t类型的完整定义?,c,sockets,networking,types,header-files,C,Sockets,Networking,Types,Header Files,我正在使用TCP将文件从客户端发送到服务器。为了标记文件的结尾,我喜欢在实际数据之前发送文件大小。因此,我使用stat系统调用来查找文件的大小。这是类型off\t。我想知道它占用了多少字节,这样我就可以在服务器端正确地读取它。它在中定义。但我不明白这个定义。它只是将\uuu off\t或

我正在使用TCP将文件从客户端发送到服务器。为了标记文件的结尾,我喜欢在实际数据之前发送文件大小。因此,我使用
stat
系统调用来查找文件的大小。这是类型
off\t
。我想知道它占用了多少字节,这样我就可以在服务器端正确地读取它。它在
中定义。但我不明白这个定义。它只是将
\uuu off\t或
定义为
off\t
。在哪里查找
\uuuu off\uu t
?还有一个惯例是,头文件中的大多数内容都以
\uuuu
为前缀,当我阅读头文件以便更好地理解时,我会感到害怕。如何更好地读取头文件

#ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
#endif 

由于这个答案仍然被投票通过,我想指出,您几乎不需要查看头文件。如果您想编写可靠的代码,最好查看标准。比“我的机器上如何定义
off\t
更好的问题是“标准如何定义
off\t
?”。遵循标准意味着您的代码将在今天和明天在任何机器上运行

在这种情况下,
off\u t
不是由C标准定义的。这是POSIX标准的一部分

不幸的是,
off\u t
的定义不是很严格。我能找到的所有定义都在以下页面上:

blkcnt\u t
off\u t
应为有符号整数类型

这意味着你不能确定它有多大。如果您使用的是GNU C,那么可以使用中的指令来确保它是64位的。或者更好,您可以在将其放到导线上之前将其转换为标准定义的尺寸。这就是谷歌工作的项目(虽然这是一个C++项目)。
所以,我认为“在我的头文件中哪里可以找到定义”不是最好的问题。 但是,为了完整起见,以下是答案:

在我的机器(以及大多数使用glibc的机器)上,您可以在
bits/types.h
中找到定义(正如顶部的一条评论所说,从未直接包含此文件),但它在一堆宏中有点模糊。尝试解开它们的另一种方法是查看预处理器输出:

#include <stdio.h>
#include <sys/types.h>

int main(void) {
  off_t blah;

  return 0;
}
但是,如果您想知道某物的大小,可以始终使用
sizeof()
运算符

编辑:刚才看到了您的问题中关于
\uuuuuu
的部分。关键的一点是,以
\uuuu
开头的名称是为实现保留的(因此,您不应该以
\uuuu
开头自己的定义)。

正如《GNU C库参考手册》所说

off\t
这是一种有符号整数类型,用于表示文件大小。
在GNUC库中,此类型的范围不小于int。
如果源代码是用_FILE_OFFSET_BITS==64编译的,那么
类型将透明地替换为off64\t。

off64\u t
此类型的使用与off\t类似。区别在于
即使在32位机器上,off_t类型也有32位,
off64\u t有64位,因此能够寻址最多2^63字节的文件
长度。使用此类型的_FILE_OFFSET_BITS==64进行编译时
以off\t的名称提供。
因此,如果您希望以可靠的方式表示客户端和服务器之间的文件大小,可以:

  • 相应地使用
    off64\u t
    类型和
    stat64()
    函数(因为它填充结构
    stat64
    ,其中包含
    off64\u t
    类型本身)。键入
    off64\u t
    可确保32位和64位计算机上的大小相同
  • 如前所述,使用
    -D\u FILE\u OFFSET\u BITS==64
    编译您的代码,并使用常用的
    off\t
    stat()
  • off\u t
    转换为固定大小的类型
    int64\u t
    (C99标准)。 注意:(我的书《简而言之C》
    说它是C99标准,但在实现中是可选的)。最新的C11标准规定:
  • 7.20.1.1精确宽度整数类型
    1 typedef name intN_t指定宽度为N的有符号整数类型,
    无填充位和2的补码表示。因此,int8\t
    表示宽度正好为8位的有符号整数类型。
    不言而喻。
    
    关于实施:

    7.20整数类型
    ... 实施应提供“要求”的类型,
    但无需提供任何其他信息(称为“可选”)。
    ...
    以下类型是必需的:
    至少内部
    内部至少16个单元
    内部至少32单元至少32单元
    国际租赁公司
    此表单的所有其他类型都是可选的。
    

    因此,一般来说,C标准不能保证具有固定大小的类型。但是大多数编译器(包括gcc)都支持此功能。

    如果您在跟踪定义时遇到问题,可以使用编译器的预处理输出,它将告诉您所有需要知道的信息。例如

    $ cat test.c
    #include <stdio.h>
    $ cc -E test.c | grep off_t
    typedef long int __off_t;
    typedef __off64_t __loff_t;
      __off_t __pos;
      __off_t _old_offset;
    typedef __off_t off_t;
    extern int fseeko (FILE *__stream, __off_t __off, int __whence);
    extern __off_t ftello (FILE *__stream) ;
    


    如果你在写可移植代码,答案是“你说不出来”,好消息是你不需要这么做。您的协议应包括将大小写为(例如)“8个八位字节,big-endian格式”(理想情况下,检查实际大小是否适合8个八位字节)。

    我使用开关大小。在我的机器(客户端)上,它是4个字节。所以我能表示的最大文件大小是2^32字节。在这种特殊情况下,这是否必须与服务器上的关闭大小相匹配。我不应该相信。的确,
    off\t
    在不同的机器(或编译器)上可以有不同的大小。请注意,在GCC中,您可以使用
    -D_FILE\u OFFSET_BITS=64
    获取8字节
    off_t
    size_t
    定义。好的。那么服务器应该查找前4个或前8个字节以获取文件的长度。好的,我知道了。我应该使用更大的值,比如long long哪个担保
    $ cat test.c
    #include <stdio.h>
    $ cc -E test.c | grep off_t
    typedef long int __off_t;
    typedef __off64_t __loff_t;
      __off_t __pos;
      __off_t _old_offset;
    typedef __off_t off_t;
    extern int fseeko (FILE *__stream, __off_t __off, int __whence);
    extern __off_t ftello (FILE *__stream) ;
    
    # 132 "/usr/include/bits/types.h" 2 3 4
    
    
    typedef unsigned long int __dev_t;
    typedef unsigned int __uid_t;
    typedef unsigned int __gid_t;
    typedef unsigned long int __ino_t;
    typedef unsigned long int __ino64_t;
    typedef unsigned int __mode_t;
    typedef unsigned long int __nlink_t;
    typedef long int __off_t;
    typedef long int __off64_t;
    
    # 91 "/usr/include/stdio.h" 3 4
    typedef __off_t off_t;