gpt4 book ai didi

c - 关心参数 sizeof(sockaddr_in)

转载 作者:太空宇宙 更新时间:2023-11-04 03:41:25 26 4
gpt4 key购买 nike

在作为connect() 的函数中,最后一个参数是sockaddr_in 结构的大小。

很好,但是 sin_zero 未使用(系统不会像我在 stackoverflow.com/questions/28280581/how-kernels-recognize-sin-zero-sockaddr-in-structure-pushed 中理解的那样“弹出 sin_zero”),那么函数需要这个参数是为了什么?

即asm 或当 C 编译为 asm 时,connect() 的 RET 必须指定要删除的字节数 (RET n),即 connect() 参数的字节数。如果我可以在 asm 中插入或不插入 sin_zero 并在 C 中为 sin_zero 赋值,为什么 n 是一个固定数字(不要改变我指定 sin_zero 或否)。如果我在 asm 中创建一个程序并且我不插入 sin_zero到堆栈,程序运行完美......但 n 是相同的数字!

最佳答案

A sockaddr_in是一个包含互联网地址的结构。此结构在 <netinet/in.h> 中定义.这是服务器/客户端地址 struct sockaddr_in serv_addr, cli_addr;这是定义:

struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

sin_family – 使用 AF_INET sin_port – 端口号(按网络字节顺序 => 使用 htons(port) ) sin_addr – 结构描述的互联网地址 in_addr

struct in_addr {
unsigned long s_addr;
};

设置s_addr到 INADDR_ANY => 本地互联网地址。 sin_zero[] – 设置为 0bzero()memset() .填充以使结构与 SOCKADDR 大小相同.

绑定(bind)() 示例

int mysock,err;
struct sockaddr_in myaddr;
mysock = socket(AF_INET,SOCK_STREAM,0);
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons( portnum );
myaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(myaddr.sin_zero),sizeof(myaddr.sin_zero));
err = bind(mysock, (struct sockaddr *) &myaddr, sizeof(myaddr));

我找到了一些关于 sin_zero 的信息(Unix网络编程第3.2章)

The POSIX specification requires only three members in the structure: sin_family, sin_addr, and sin_port. It is acceptable for a POSIX-compliant implementation to define additional structure members, and this is normal for an Internet socket address structure. Almost all implementations add the sin_zero member so that all socket address structures are at least 16 bytes in size.

以及sin_zero的定义

unsigned char  __pad[__SOCK_SIZE__ - sizeof(short int)
- sizeof(unsigned short int) - sizeof(struct in_addr)];
};
#define sin_zero __pad

Most of the net code does not use sockaddr_in, it uses sockaddr. When you use a function like sendto, you must explicitly cast sockaddr_in, or whatever address your using, to sockaddr. sockaddr_in is the same size as sockaddr, but internally the sizes are the same because of a slight hack.

那个 hack 是 sin_zero。实际上,sockaddr_in 中有用数据的长度比 sockaddr 短。但是差异是在 sockaddr_in 中使用一个小缓冲区填充的;该缓冲区是 sin_zero。

在某些架构上,不清除 sin_zero 不会导致任何问题。但在其他架构上它可能。规范要求清除 sin_zero,因此如果您希望您的代码现在和将来都没有错误,则必须这样做。

请看page .

关于c - 关心参数 sizeof(sockaddr_in),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28318213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com