socket中如何获取接收方IP信息
时间: 2024-04-15 14:30:01 浏览: 20
在使用 Socket 进行网络通信时,可以通过一些方法获取接收方的 IP 信息。下面介绍两种常用的方法:
1. 使用 `getpeername` 函数:
- 在服务器端,当接收到连接请求并建立连接后,可以调用 `getpeername` 函数来获取对方的 IP 信息。
- `getpeername` 函数的参数是已连接 Socket 的文件描述符,以及一个指向 `struct sockaddr` 类型的指针。
- 示例代码如下:
```c
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int serverSocket, clientSocket;
struct sockaddr_in serverAddr, clientAddr;
socklen_t addrLen = sizeof(clientAddr);
// 创建 Socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
// 绑定 Socket
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(8080);
bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
// 监听连接请求
listen(serverSocket, 5);
// 接受连接请求
clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &addrLen);
// 获取对方的 IP 信息
char clientIP[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(clientAddr.sin_addr), clientIP, INET_ADDRSTRLEN);
printf("Client IP: %s\n", clientIP);
close(clientSocket);
close(serverSocket);
return 0;
}
```
2. 使用 `recvfrom` 函数(适用于 UDP Socket):
- 当使用 UDP Socket 进行通信时,可以使用 `recvfrom` 函数接收数据,并从中获取发送方的 IP 信息。
- `recvfrom` 函数的参数是已绑定的 Socket 的文件描述符,接收缓冲区,以及一个指向 `struct sockaddr` 类型的指针。
- 示例代码如下:
```c
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
int main() {
int socketFd;
struct sockaddr_in serverAddr, clientAddr;
socklen_t addrLen = sizeof(clientAddr);
// 创建 Socket
socketFd = socket(AF_INET, SOCK_DGRAM, 0);
// 绑定 Socket
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(8080);
bind(socketFd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
// 接收数据并获取发送方的 IP 信息
char buffer[1024];
int recvLen = recvfrom(socketFd, buffer, sizeof(buffer), 0, (struct sockaddr*)&clientAddr, &addrLen);
char clientIP[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(clientAddr.sin_addr), clientIP, INET_ADDRSTRLEN);
printf("Received from %s: %s\n", clientIP, buffer);
close(socketFd);
return 0;
}
```
这些方法可以让您在使用 Socket 进行网络通信时获取接收方的 IP 信息。希望对您有所帮助!如果还有其他问题,请随时提问。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)