在socket编程中,如何获取连接另一端(客户端)的ip地址,使用accept或者getpeername

这篇博客介绍如何在socket编程中通过accept和getpeername函数获取客户端的IP地址。示例代码展示了服务器端如何监听和接受客户端的连接请求,并使用getpeername函数获取连接的客户端IP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//这段代码没有实际的功能,只是为了获取连接另一端的ip地址 
#include <iostream>
#include <winsock.h>
#include <stdio.h>

#pragma comment(lib, "wsock32")
using namespace std;

void main() 
{
	int ret = 0;
	WSADATA wsadata;
	WORD version = MAKEWORD(2,0);
	ret = WSAStartup(version,&wsadata);

	//服务器端口创建
	SOCKET m_hServerSocket;
	m_hServerSocket = socket(AF_INET,SOCK_STREAM,0);

	//服务器端口绑定
	SOCKADDR_IN m_addr;
	m_addr.sin_family = AF_INET;
	m_addr.sin_addr.S_un.S_addr = INADDR_ANY;//如果服务器是单网卡的,则就是这块网卡的ip地址;如果是多网卡,则是其中的任意一块的ip地址
	m_addr.sin_port = htons(10000);
	ret = bind(m_hServerSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));
	
	//服务器端口开始监听
	ret = listen(m_hServerSocket,10);//第二个参数指定最大申请的连接数

	WSADATA cli_wsadata;
	ret = WSAStartup(version,&cli_wsadata);

	//客户端端口创建
	SOCKET m_hClientSocket;
	m_hClientSocket = socket(AF_INET,SOCK_STREAM,0);


	//客户端向服务器发送连接请求
	SOCKADDR_IN m_addr1;
	m_addr1.sin_family = AF_INET;
	m_a
### 获取直接连接服务器客户端 IP 地址Socket 编程中,当服务器客户端建立连接后,可以通过特定方法获取客户端IP 地址。对于 TCP 连接模式下的套接字,通常使用 `getpeername` 方法来实现这一功能。 #### 使用 C/C++ 的方式 在 C 或 C++ 中,通过调用 `accept` 函数接受客户端连接时,可以得到一个表示新连接的文件描述符以及存储客户端地址信息的结构体 `(struct sockaddr)`。随后可利用此结构体提取客户端IP 地址并将其转换为字符串形式: ```c #include <stdio.h> #include <string.h> #include <arpa/inet.h> int main() { struct sockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); int conn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &addr_len); // 假设 listen_fd 已经初始化好 if (conn_fd >= 0) { char ip_str[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(client_addr.sin_addr), ip_str, INET_ADDRSTRLEN); printf("Client IP Address: %s\n", ip_str); // 打印客户端IP地址 } } ``` 上述代码片段展示了如何从已建立的连接获取客户端IP 地址[^1]。 #### Python 实现 Python 提供了更简洁的方式完成相同操作。一旦建立了 socket 对象并通过 `.accept()` 接收到来自客户端的新连接,则返回元组的第一个元素即代表新的连接对象,而第二个参数则包含了远程主机的信息(包括 IP 和端口号)。具体如下所示: ```python import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 9999)) server_socket.listen(5) connection, address = server_socket.accept() print(f'Connected by {address}') # 输出形如 ('127.0.0.1', port_number) ``` 这里的关键在于 `address` 变量保存的就是发起请求的那个设备的相关数据——其中就包含有我们需要查询的目标机器公网或者局域网内的唯一标识(IP)[^2]。 综上所述,在不同语言环境下均存在有效手段用于捕获访问者的真实网络位置标记;无论是采用高级脚本还是底层系统调用来达成目的均可行通。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值