- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在作为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[]
– 设置为 0
与 bzero()
或 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/
我一直在学习如何创建自定义 ArrayAdapter 并熟悉重写 ArrayAdapter 的 getViewTypeCount 和 getItemViewType 方法。 为什么 Android V
我是一名优秀的程序员,十分优秀!