metartc5_jz源码阅读-yang_ice_stun_request

本文介绍了如何使用Yang库中的IceServer、YangRtcUdp和YangRtcStun类进行STUN请求,以获取本地计算机的外网IP,以便于在P2P通信中实现打洞功能。
摘要由CSDN通过智能技术生成
//发起stun request,用于请求本机的外网ip地址用于p2p打洞
int32_t yang_ice_stun_request(YangIceServer* server,int32_t localport){

	char tmp[1024]={0};
	int32_t err=Yang_Ok;
	int32_t waitTime=0;

	//创建udp
	YangRtcUdp* udp=(YangRtcUdp*)calloc(sizeof(YangRtcUdp),1);
	//创建stun
	YangRtcStun* stun=(YangRtcStun*)calloc(sizeof(YangRtcStun),1);
	//创建stunRequest
	YangIceStunRequest request;
	//对stunRequest赋值。
	request.server=server;
	request.stun=stun;
	request.response=yangfalse;

	//设置stun的回调函数
	yang_create_stun(stun);

	//设置本地局域网ip地址,设置udp的回调函数
	yang_create_rtcudp(udp,localport);

	//获取p2pServer的点分10进制ip地址
	char serverIp[64]={0};
	yang_getIp(server->serverIp,serverIp);
	//将serverIp和serverPort存入udp->session的remote_addr中,这个ip地址为ice云端的ip地址,调用这个服务器获取本机的公网ip地址。
	udp->updateRemoteAddress(&udp->session,serverIp,server->serverPort);

	//设置stun回调的接收函数。
	udp->session.receive=g_yang_ice_stun_receive;

	//将stunRequest存入user中,用于回调时能拿到stunRequest。
	udp->session.user=&request;

	//开始stun请求
	udp->start(&udp->session);

	//初始化一个buf
	YangBuffer buf;
	yang_init_buffer(&buf,tmp,1024);

	//调用random随机一个pwd
	char* pwd = (char*) calloc(33, 1);
	yang_cstr_random(32, pwd);

	//编码stunRequest,传入username、pwd,编码后的数据存入buf中。
	stun->encodeStunServer(&buf,udp,server->username,pwd);

	//调用udp->sendData方法将buf的data发送给stun云服务器
	if((err=udp->sendData(&udp->session,buf.data, yang_buffer_pos(&buf)))!=Yang_Ok){
		yang_error("stun server request fail");
		goto ret;
	}

	//如果response未返回,则每2ms自增一次waitTime,每50ms重试一次,最多重试时长为1000ms。
	while(!request.response&&waitTime<500){
		yang_usleep(YANG_UTIME_MILLISECONDS*2);
		waitTime++;
		if(waitTime%25==0){
			memset(tmp,0,sizeof(tmp));
			yang_init_buffer(&buf,tmp,sizeof(tmp));
			stun->encodeStunServer(&buf,udp,server->username,pwd);
			if((err=udp->sendData(&udp->session,buf.data, yang_buffer_pos(&buf)))!=Yang_Ok){
				yang_error("stun server request fail");
				goto ret;
			}
		}
	}

	//如果response返回了,则设置stun返回的公网ip和端口号。
	if(request.response){
		server->stunIp=request.ip;
		server->stunPort=request.port;
	}else{
		err=ERROR_RTC_STUN;
	}

	ret:
		//释放内存,停止session,udp,stun.
		yang_free(pwd);
		udp->stop(&udp->session);
		yang_destroy_rtcudp(udp);
		yang_free(udp);
		yang_destroy_stun(stun);
		yang_free(stun);
		return err;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王方帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值