获取TCP链接的四元组

本文介绍了一种通过C++实现的方法,用于获取TCP连接的本地及远程IP地址与端口号,即TCP链接四元组。该方法使用了getsockname和getpeername函数来分别获取本地和远程的地址信息。
<pre name="code" class="cpp">// 获取TCP链接四元组
bool GetSocketIpPort(SOCKET s,
		string& local_ip,
		WORD& local_port,
		string& peer_ip,
		WORD& peer_port)
{
	local_ip = "0.0.0.0";
	local_port = 0;
	peer_ip = "0.0.0.0";
	peer_port = 0;

	struct sockaddr_in sa;
	int len = sizeof(sa);


	if(getsockname(s, (struct sockaddr *)&sa, &len) != 0)
	{
		return false;
	}
	local_ip = inet_ntoa(sa.sin_addr);
	local_port = htons(sa.sin_port);
	

	if(getpeername(s, (struct sockaddr *)&sa, &len) != 0)
	{
		return false;
	}
	peer_ip = inet_ntoa(sa.sin_addr);
	peer_port = htons(sa.sin_port);
	
	return true;
}




                
### 实现STM32上的TCP/IP协议栈 #### 选择硬件平台和支持库 对于STM32系列微控制器而言,要实现TCP/IP协议栈通常会选择带有以太网接口的型号,如STM32F107VC等。此外,还需要搭配合适的PHY芯片来完成物理层的数据收发工作,例如ENC28J60网卡可以作为一个选项[^3]。 #### 配置开发环境 安装并配置好适合于目标板子的集成开发环境(IDE),比如Keil MDK或是ST官方推荐的TrueSTUDIO。接着下载LwIP开源轻量级互联网协议栈以及配套的支持包,这些资源可以从意法半导体官方网站获取或者第三方托管平台上找到对应的版本[^4]。 #### 初始化网络参数 在网络初始化阶段,需要设置MAC地址、IP地址等相关信息。如果采用动态主机配置协议(DHCP)自动分配,则只需指定一个有效的MAC地址;而静态方式则需手动设定完整的四元组(IP, Subnet Mask, Gateway, DNS Server)[^5]。 ```c // 设置静态 IP 地址 struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; IP4_ADDR(&ipaddr, 192, 168, 1, 1); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 1, 254); netif_add(netif, &ipaddr, &netmask, &gw, NULL /* no state */, ethernetif_init, tcpip_input); ``` #### 编写应用程序逻辑 基于LwIP提供的API函数构建具体的应用场景下的通信流程,包括但不限于创建套接字(socket), 绑定端口(bind), 监听连接(listen), 接受请求(accept), 发送数据(send)/接收数据(recv)等一系列操作[^2]。 ```c err_t err; struct tcp_pcb *pcb; /* 创建一个新的 TCP PCB */ pcb = tcp_new(); tcp_bind(pcb, IP_ANY_TYPE, port); /* 开始监听传入连接 */ pcb = tcp_listen(pcb); tcp_accept(pcb, accept_callback); while (1){ // 主循环处理其他任务... } ``` #### 测试与调试 编译链接完成后将固件烧录至单片机内部闪存空间内运行测试。借助Wireshark这类抓包工具观察实际发送接收报文情况辅助定位可能出现的问题所在之处[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值