再探P2P之UDP内网穿透实例 c++

本文介绍了使用C++实现P2P通信中的UDP内网穿透,服务器端负责转发客户端连接请求,客户端通过双线程分别进行接收和发送,确保打洞与通信同步进行。在Port Restricted Cone NAT类型的网络环境下,经过多次打洞尝试,实验成功,实现了两个局域网内的客户端之间的通信。然而,尝试TCP穿透时遇到了问题,目前尚未解决。

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

公网服务器端: 

单线程,循环接收连接请求。之后转发两个客户端的IP和端口,转发发完成后自行关闭。

/*
文件:server.c
PS:第一个连接上服务器的客户端,称为client1,第二个连接上服务器的客户端称为client2
这个服务器的功能是:
1:对于client1,它返回"first",并在client2连接上之后,将client2经过转换后的IP和port发给client1;
2:对于client2,它返回client1经过转换后的IP和port和自身的port,并在随后断开与他们的连接。
 */

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>

#define MAXLINE 128
#define SERV_PORT 8877

//发生了致命错误,退出程序

void error_quit(const char *str) {
	fprintf(stderr, "%s", str);
	//如果设置了错误号,就输入出错原因
	if (errno != 0)
		fprintf(stderr, " : %s", strerror(errno));
	printf("\n");
	exit(1);
}

int main(void) {
	int res, cur_port;
	int connfd, firstfd, listenfd;
	int count = 0;
	char str_ip[MAXLINE] = {0}; //当前IP地址
	char str_ip1[MAXLINE] = {0}; //缓存IP地址1
	char cur_inf[MAXLINE] = {0}; //当前的连接信息[IP+port]
	char first_inf[MAXLINE] = {0}; //第一个链接的信息[IP+port]
	char buffer[MAXLINE] = {0}; //临时发送缓冲区
	struct sockaddr_in cliaddr;
	struct sockaddr_in servaddr;
	socklen_t clilen;
	int aport = 0;
	memset(&cliaddr, 0, sizeof (sockaddr_in));
	clilen = (socklen_t)sizeof (cliaddr);

	//创建用于监听TCP协议套接字        
	listenfd = socket(AF_INET, SOCK_DGRAM, 0);
	memset(&servaddr, 0, sizeof (servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(SERV_PORT);
	//把socket和socket地址结构联系起来       
	res = bind(listenfd, (struct sockaddr *) &servaddr, sizeof (servaddr));
	if (-1 == res)
		error_quit("bind error");
	while (1) {
		printf("waiting\n");
		fflush(stdout);
		//接收来自客户端的连接

		sockaddr_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值