metartc5_jz源码阅读-yang_run_rtcudp_thread

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源码阅读,c语言,p2p,音视频)