metartc5_jz源码阅读-yang_run_p2pserver_thread

void* yang_run_p2pserver_thread(void *obj) {
	//为p2pServer创建socket,AF_INET表示ip4,SOCK_STREAM表示面向可靠连接的TCP
	YangP2pServer *p2p = (YangP2pServer*) obj;
	p2p->isStart = 1;
	p2p->serverfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	//设置socket接收数据的超时时间为200ms
	struct timeval tv;
	tv.tv_sec = 0;
	tv.tv_usec = 200000;  // 200 ms
	setsockopt(p2p->serverfd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &tv,sizeof(struct timeval));

	yang_trace("\nhttp tcp server is starting,listenPort==%d", p2p->serverPort);

	//将p2pServer的socket和本地ip地址进行绑定。
	if (bind(p2p->serverfd, (struct sockaddr*) &p2p->local_addr,sizeof(struct sockaddr_in)) < 0) {
		yang_error("http server bind error(%d)",GetSockError());
		exit(1);
	}

	//开启p2pServer的socket客户端连接监听,最大连接数为5
	listen(p2p->serverfd, 5);

	//设置循环接收客户端发来的数据。
	p2p->isLoop = 1;
	socklen_t src_len = sizeof(struct sockaddr_in);
	while (p2p->isLoop) {
		struct sockaddr_in src;
		memset(&src, 0, src_len);

		//这里代码阻塞等待,直到客户端连接此p2pServer后将ip地址放到src中。
		int connfd = accept(p2p->serverfd, (struct sockaddr*) &src, &src_len);
		if(connfd>-1){
			pthread_t th;
			//保存客户端的连接标识,后续通过这个标识与客户端通信。
			p2p->connFd=connfd;
			memset(p2p->remoteIp,0,sizeof(p2p->remoteIp));

			//将32位二进制的ip地址转换成点分十进制ip字符串存入p2p->remoteIp中。
			inet_ntop(AF_INET,&src.sin_addr.s_addr, p2p->remoteIp, sizeof(p2p->remoteIp));

			//创建子线程执行yang_run_http_thread方法。
			pthread_create(&th, 0, yang_run_http_thread, p2p);
		}
	}
	//当某个地方将p2p的isoop置为0时将退出等待客户端连接的操作,关闭p2pServer的socket。
	p2p->isStart = 0;
	closesocket(p2p->serverfd);
	p2p->serverfd = -1;
	return NULL;
}

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