http://blog.youkuaiyun.com/innost/article/details/8474683
http://blog.youkuaiyun.com/lilian0118/article/details/22849249
http://blog.youkuaiyun.com/lilian0118/article/details/22732747
http://blog.youkuaiyun.com/lilian0118/article/details/22408287
http://blog.youkuaiyun.com/lilian0118/article/details/22376059
前面我们分析到WifiDisplaySource会调用ANetworkSession的接口去创建一个socket,并在这个socket上监听是否有客户端的连接请求。先来看看Wifi Display规范的一些流程图:
从之前的一篇文章中,当ANetworkSession创建好RTSP的listen socket后,就会把它加入到selelct中等待对方的连接,那我们首先来看ANetworkSession的threadLoop方法:
[java] view plain copy
- void ANetworkSession::threadLoop() {
- int res = select(maxFd + 1, &rs, &ws, NULL, NULL /* tv */);
- {
- Mutex::Autolock autoLock(mLock);
- List<sp<Session> > sessionsToAdd;
- for (size_t i = mSessions.size(); res > 0 && i-- > 0;) {
- const sp<Session> &session = mSessions.valueAt(i);
- int s = session->socket();
- if (s < 0) {
- continue;
- }
- if (FD_ISSET(s, &rs) || FD_ISSET(s, &ws)) {
- --res;
- }
- if (FD_ISSET(s, &rs)) {
- if (session->isRTSPServer() || session->isTCPDatagramServer()) {
- struct sockaddr_in remoteAddr;
- socklen_t remoteAddrLen = sizeof(remoteAddr);
- int clientSocket = accept(
- s, (struct sockaddr *)&remoteAddr, &remoteAddrLen);
- if (clientSocket >= 0) {
- status_t err = MakeSocketNonBlocking(clientSocket);
- if (err != OK) {
- } else {
- in_addr_t addr = ntohl(remoteAddr.sin_addr.s_addr);
- ALOGI("incoming connection from %d.%d.%d.%d:%d "
- "(socket %d)",
- (addr >> 24),
- (addr >> 16) & 0xff,
- (addr >> 8) & 0xff,
- addr &a