void* yang_run_rtcudp_thread(void *obj) {
//拿到传入的UdpSession
YangUdpSession *udp = (YangUdpSession*) obj;
//设置为开始
udp->isStart = 1;
//设置socket的超时时间为200ms
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 200000; // 200 ms
setsockopt(udp->fd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &tv, sizeof(struct timeval));
//将udp的socket绑定本地ip地址和端口号
if (bind(udp->fd, (struct sockaddr*) &udp->local_addr,
sizeof(struct sockaddr_in)) < 0) {
yang_error("Udp server bind error");
exit(1);
}
//创建buffer变量
char buffer[2048] = { 0 };
//设置循环运行
udp->isLoop = 1;
int32_t len = 0;
//开启stun的timer
if (!udp->notRemoteInit&&udp->startStunTimer) udp->startStunTimer(udp->user);
//获取ip地址结构体的长度。
socklen_t src_len = sizeof(struct sockaddr_in);
yang_trace("\n udp server is starting,localPort=%d", udp->localPort);
while (udp->isLoop) {
//创建一个ip地址结构体并重置为0
struct sockaddr_in src;
memset(&src, 0, src_len);
//buffer重置为0
memset(buffer, 0, 2048);
//从fd中接收长度为2048的数据存到buffer中,并将数据来源的ip地址和端口号存入src中。
if ((len = recvfrom(udp->fd, buffer, 2048, 0, (struct sockaddr*) &src, &src_len)) > 0) {
//如果不是远端初始化的话则读取ip地址和端口号。
if(udp->notRemoteInit){
//从src中获取端口号,调用ntohs方法将网络字节序转为主机字节序存入remotePort
udp->remotePort = ntohs(src.sin_port);
//存储网络字节序的端口号
udp->remote_addr.sin_port = src.sin_port;
//存储ip地址
udp->remote_addr.sin_addr.s_addr = src.sin_addr.s_addr;
udp->notRemoteInit=0;
}
//调用udp的receive方法将读取的buffer和udp->user传入。
if (udp->receive) udp->receive(buffer, len, udp->user);
}
}
//当udp->isLoop被置为0时结束接收数据,关闭fd。
udp->isStart = 0;
closesocket(udp->fd);
udp->fd = -1;
return NULL;
}
metartc5_jz源码阅读-yang_run_rtcudp_thread
最新推荐文章于 2024-07-25 15:54:02 发布