Java双亲委托机制详解:从类加载异常到热部署实战
2026/10/15 2:31:05
各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb
在 TCP 通信中,服务器的角色就像是一家实体店。
如果你不开店(不 Bind),虽然你也可以去逛街(作为客户端连接别人),但顾客(客户端)永远找不到你在哪里。因此,服务器必须绑定固定的 IP 和端口。
sockaddrvssockaddr_in这是 Socket 编程中最让新手困惑的地方:为什么有两个地址结构体?
bind函数设计之初,是为了支持所有协议(IPv4, IPv6, UNIX 域等)。因此,它的参数类型是通用的struct sockaddr*。
为了方便程序员操作,针对 IPv4 协议,系统提供了专用的struct sockaddr_in。好消息是,它们在内存中的大小完全一样(16字节),可以直接强转。
| 字节偏移 | struct sockaddr(通用) | struct sockaddr_in(IPv4专用) |
|---|---|---|
| 0 - 1 | sa_family(地址族) | sin_family(地址族,如 AF_INET) |
| 2 - 3 | sa_data(混合数据) | sin_port(端口号) |
| 4 - 7 | … | sin_addr(IP地址) |
| 8 - 15 | … | sin_zero(填充字节,为了凑齐16字节) |
最佳实践:我们在代码中定义和填充
sockaddr_in,但在调用bind时,将其强制类型转换为sockaddr*。
intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);sockfd):通过socket()创建的文件描述符。addr):指向地址结构体的指针(需强转)。addrlen):结构体的大小,通常写sizeof(struct sockaddr_in)。