metartc5_jz源码阅读-yang_ice_stun_request

//发起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;
}

你可能感兴趣的:(metartc5_jz源码阅读,c语言,p2p,音视频)