ReplayKit2 有线投屏项目-反向Socket实现
Posted doudouyoutang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReplayKit2 有线投屏项目-反向Socket实现相关的知识,希望对你有一定的参考价值。
一、需求
我们在使用RTMP协议进行推流的时候,底层仍然采用的是TCP协议或者QUICK协议,有客户端主动发起请求。但是在有线投屏中,需要PC端向手机发起请求建立连接
二、实现
在客户端主动发起请求之前,我们首先启动一个socket监听来自PC的连接,如果连接成功,那么我们使用这个已经建立好的连接,继续后面的流程
在实现中,我们需要设计一个超时的机制,一般socket可以对send和recv设置超时,当然超时都是对同步的socket生效的。
正常设置如下:
struct timeval tv, recv_timeout; tv.tv_sec = timeout / 1000; tv.tv_usec = static_cast<int>(timeout % 1000 * 1000); int ret = ::setsockopt(m_nRealServerSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*) &tv, sizeof(tv)); ret = ::setsockopt(m_nRealServerSocket, SOL_SOCKET, SO_SNDTIMEO, (const char*) &tv, sizeof(tv));
但是这个设置对accept在ios平台是不生效的,必须采用select的方式
select监听描述符如下所示
#define MYPORT 1937 // the port users will be connecting to #define BACKLOG 1 // how many pending connections queue will hold #define BUF_SIZE 200 int fd_A[BACKLOG]; // accepted connection fd int conn_amount; // current connection amount - (void)startSelectDemo2 { int sock_fd, new_fd; // listen on sock_fd, new connection on new_fd struct sockaddr_in server_addr; // server address information struct sockaddr_in client_addr; // connector‘s address information socklen_t sin_size; int yes = 1; char buf[BUF_SIZE]; int ret; int i; if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { NSLog(@"socket"); exit(1); } if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { NSLog(@"setsockopt"); exit(1); } server_addr.sin_family = AF_INET; // host byte order server_addr.sin_port = htons(MYPORT); // short, network byte order server_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP memset(server_addr.sin_zero, ‘