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源码阅读-yang_run_p2pserver_thread
于 2023-12-30 19:01:45 首次发布