//发起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源码阅读-yang_ice_stun_request
最新推荐文章于 2024-09-16 17:44:00 发布
本文介绍了如何使用Yang库中的IceServer、YangRtcUdp和YangRtcStun类进行STUN请求,以获取本地计算机的外网IP,以便于在P2P通信中实现打洞功能。
摘要由CSDN通过智能技术生成