getpeername怎么用
时间: 2023-10-02 22:13:15 浏览: 60
`getpeername`函数用于获取与套接字连接的对端(远程)地址信息,包括IP地址和端口号。它的原型如下:
```c
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
函数参数解释如下:
- `sockfd`:套接字描述符,即要获取对端地址信息的套接字。
- `addr`:指向一个`struct sockaddr`类型的结构体,用于存储对端地址信息。
- `addrlen`:`addr`结构体的长度指针。
下面是一个示例使用`getpeername`函数获取对端地址信息的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main() {
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len = sizeof(client_addr);
// 创建TCP服务器套接字
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 绑定服务器地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(12345);
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 开始监听客户端连接请求
if (listen(server_socket, 5) == -1) {
perror("listen failed");
exit(EXIT_FAILURE);
}
printf("Server listening on port 12345...\n");
// 接受客户端连接
client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);
if (client_socket == -1) {
perror("accept failed");
exit(EXIT_FAILURE);
}
// 获取对端地址信息
struct sockaddr_in peer_addr;
socklen_t peer_addr_len = sizeof(peer_addr);
if (getpeername(client_socket, (struct sockaddr *)&peer_addr, &peer_addr_len) == -1) {
perror("getpeername failed");
exit(EXIT_FAILURE);
}
// 将IP地址转换为字符串形式
char peer_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(peer_addr.sin_addr), peer_ip, INET_ADDRSTRLEN);
printf("Peer connected from %s:%d\n", peer_ip, ntohs(peer_addr.sin_port));
// 关闭套接字
close(client_socket);
close(server_socket);
return 0;
}
```
这段代码创建了一个TCP服务器,绑定到本地IP地址的12345端口。当客户端连接成功时,通过`getpeername`函数获取对端地址信息,并将对端IP地址和端口号打印出来。最后关闭套接字连接。你可以根据自己的需要修改代码中的IP地址和端口号。