使用getpeername()或getsockname()来检查对端地址是否为空,并打印地址信息
时间: 2024-11-09 11:28:31 浏览: 37
`getpeername()` 和 `getsockname()` 是用于网络编程中的两个系统调用函数,在Linux和Unix-like系统中常见于套接字编程。这两个函数通常用于获取套接字的连接信息:
1. `getpeername(sockfd, addr, socklen)`:这个函数返回连接到当前套接字的远端地址。如果对端地址未指定(即尚未连接),它将返回错误,你可以通过检查返回值(如errno)判断地址是否为空。
2. `getsockname(sockfd, addr, socklen)`:这个函数返回本地(本机)套接字的地址。同样,如果没有绑定特定的IP地址和端口,该函数可能会失败,表明地址为空。
要检查并打印地址信息,你需要首先分配足够的内存存储地址结构(例如`struct sockaddr_in` 或 `struct sockaddr_un`),然后调用上述函数。如果地址有效,你可以从结构体中提取IP、端口号等详细信息,并将其打印出来。这里是一个基本示例(假设使用`struct sockaddr_in`):
```c
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
int main() {
int sockfd;
struct sockaddr_in local_addr, peer_addr;
socklen_t len = sizeof(local_addr);
// 创建socket...
if (bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)) == -1) {
perror("bind failed");
return 1;
}
// 获取本地地址
if (getsockname(sockfd, (struct sockaddr*)&local_addr, &len) == -1) {
perror("getsockname failed for local address");
return 1;
}
printf("Local Address: %s:%d\n", inet_ntoa(local_addr.sin_addr), ntohs(local_addr.sin_port));
// 如果需要,尝试获取远程地址
len = sizeof(peer_addr);
if (getpeername(sockfd, (struct sockaddr*)&peer_addr, &len) != -1) {
printf("Remote Address: %s:%d\n", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port));
} else {
printf("No remote address connected.\n");
}
return 0;
}
```
阅读全文