socket如何知道客户端的ip地址和端口
时间: 2023-10-04 20:12:19 浏览: 64
当服务器端接受到客户端的连接请求后,会创建一个新的 socket 与客户端进行通信。这个新的 socket 拥有自己的 IP 地址和端口号,而客户端的 IP 地址和端口号则可以从这个 socket 中获取。
具体地说,可以通过调用新的 socket 的 `getpeername()` 函数来获取客户端的 IP 地址和端口号。该函数的参数是一个指向 sockaddr 结构体的指针,用于存储客户端的地址信息。在函数调用结束后,该结构体中存储的客户端地址信息就可以被读取,其中包括客户端的 IP 地址和端口号。
例如,以下代码可以获取客户端的 IP 地址和端口号:
```c
struct sockaddr_in client_address;
socklen_t client_address_len = sizeof(client_address);
getpeername(client_socket, (struct sockaddr*)&client_address, &client_address_len);
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(client_address.sin_addr), client_ip, INET_ADDRSTRLEN);
int client_port = ntohs(client_address.sin_port);
printf("Client IP: %s\n", client_ip);
printf("Client port: %d\n", client_port);
```
其中,`client_socket` 是新创建的用于与客户端通信的 socket。`client_address` 是一个 sockaddr_in 结构体,用于存储客户端的地址信息。`client_ip` 是一个字符串,用于存储客户端的 IP 地址。`client_port` 是一个整数,用于存储客户端的端口号。