以下是 Socket API 中其他辅助函数的详细说明,包含参数列表和功能描述:
1. 地址与端口转换
inet_addr()
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
- 参数:
cp
: IPv4点分十进制字符串(如"192.168.1.1"
)。
- 返回值:
- 成功:32位网络字节序的IP地址(
in_addr_t
)。
- 失败:
INADDR_NONE
。
- 成功:32位网络字节序的IP地址(
inet_ntoa()
char *inet_ntoa(struct in_addr in);
- 参数:
in
: 网络字节序的IPv4地址结构体。
- 返回值:
- 点分十进制字符串指针(静态缓冲区,非线程安全)。
- 点分十进制字符串指针(静态缓冲区,非线程安全)。
htons()
/ htonl()
/ ntohs()
/ ntohl()
#include <netinet/in.h>
uint16_t htons(uint16_t hostshort); // 主机字节序 → 网络字节序(short)
uint32_t htonl(uint32_t hostlong); // 主机字节序 → 网络字节序(long)
uint16_t ntohs(uint16_t netshort); // 网络字节序 → 主机字节序(short)
uint32_t ntohl(uint32_t netlong); // 网络字节序 → 主机字节序(long)
2. DNS解析
gethostbyname()
(已废弃,建议用 getaddrinfo
)
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
- 参数:
name
: 域名或主机名(如"www.example.com"
)。
- 返回值:
指向hostent
结构体的指针,包含IP地址列表等。
getaddrinfo()
(现代替代方案)
int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);
void freeaddrinfo(struct addrinfo *res);
- 参数:
node
: 主机名或IP字符串。
service
: 服务名或端口号(如"80"
或"http"
)。
hints
: 过滤条件(如协议族、socket类型等)。
3. Socket控制选项
setsockopt()
/ getsockopt()
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
- 常用选项:
| Level | Optname (示例) |用途 | |—————|————————|—————————–| | SOL_SOCKET | SO_REUSEADDR |允许重用本地地址 | | SOL_SOCKET | SO_KEEPALIVE |启用TCP心跳检测 | | IPPROTO_TCP | TCP_NODELAY |禁用Nagle算法 |
4. IO控制与文件描述符
fcntl()
(设置非阻塞模式)
#include <fcntl.h>
int flags = fcntl(sockfd, F_GETFL,0);
fcntl(sockfd,F_SETFL,flags | O_NONBLOCK);
ioctl()
(获取接口信息)
#include <sys/ioctl.h>
ioctl(sockfd,FIONBIO,&on); //切换阻塞/非阻塞模式
ioctl(sockfd,FIONREAD,&bytes);//获取可读数据量
5. Socket地址信息
#### getsockname(), getpeername(),
如果需要具体场景的代码示例或其他细节,可以告诉我!
内容由零声教学AI助手提供,问题来源于学员提问