1.发送指定地址和端口的数据
bool WRTAudioTransStart(UInt32 remoteIP, UInt32 samp) {LOGD("WRTAudioTransStart %x %d\r\n", remoteIP, samp);//samp采样率if (m_bAudioTransRun) {LOGE("WRTAudioTransStar is running. m_transAudioSocket : %d\r\n", m_bAudioTransRun, m_transAudioSocket);return false;}m_transAudioSocket = socket(AF_INET, SOCK_DGRAM, 0);if (m_transAudioSocket < 0) {LOGE("WRTAudioTransStar create socket error %d\r\n", errno);return false;}//允许端口重用,防止bind errn:98int on;on = 1;int ret = setsockopt(m_transAudioSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));if (ret != 0) {close(m_transAudioSocket);m_transAudioSocket = -1;LOGE("Socket setsockopt SO_REUSEADDR error %d\r\n", errno);return false;}struct sockaddr_in sin;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = INADDR_ANY;sin.sin_port = htons(AUDIO_PORT);//接收的本地端口if (bind(m_transAudioSocket, (struct sockaddr *) &sin, sizeof(sin)) < 0) {LOGE("WRTAudioTransStar bind error %d\r\n", errno);close(m_transAudioSocket);m_transAudioSocket = -1;return false;}memset(&remoteAddr, 0, sizeof(remoteAddr));remoteAddr.sin_family = AF_INET;remoteAddr.sin_addr.s_addr = remoteIP;remoteAddr.sin_port = htons(AUDIO_PORT);//对方接收的端口m_bAudioTransRun = true; CreateDetachedThread(threadAudioRecv, NULL, true); //接收播放return true;}
发送数据(线程里面)
while (audioSendBufferLength >= 384) {if (m_transAudioSocket > 0) {int ret = sendto(m_transAudioSocket, (char *) pbuf, 384, 0, (struct sockaddr *) &remoteAddr,sizeof(struct sockaddr_in));if (ret < 0)LOGE("send audio data errno %d\r\n", errno);} elsebreak;}
接收数据
void *threadAudioRecv(void *lpparam) {struct sockaddr_in from;int addrlen, recvlen;char recvBuffer[1024];short audioBuffer[2048];int audioBufferLength = 0;UInt32 curVolume = 0;struct timeval tv_out;fd_set fR;tv_out.tv_sec = 1;tv_out.tv_usec = 0; LOGD("threadAudioRecv start\r\n"); while (m_bAudioTransRun) {tv_out.tv_sec = 1;tv_out.tv_usec = 0;FD_ZERO(&fR);FD_SET(m_transAudioSocket, &fR);if (select(m_transAudioSocket + 1, &fR, NULL, NULL, &tv_out) <= 0) //出错或超时 {LOGE("audio select timeout or error. errno = %d, time : %d s", errno, tv_out.tv_sec);continue;}//LOGD("threadAudioRecv m_bAudioTransRun = %d,m_transAudioSocket = %d",m_bAudioTransRun,m_transAudioSocket);if (!m_bAudioTransRun||(-1==m_transAudioSocket))break;//LOGD("threadAudioRecv FD_ISSET %d %p \r\n",m_transAudioSocket,&fR);if (!FD_ISSET(m_transAudioSocket,&fR)){//LOGE("audio select socket is not set");continue;}addrlen = sizeof(struct sockaddr_in);int receiveCount = 1024;recvlen = recvfrom(m_transAudioSocket, recvBuffer, receiveCount, 0, (struct sockaddr *) &from, &addrlen);//LOGE("threadAudioRecv recvfrom audio ret %d", recvlen);if (recvlen < 0) {LOGE("recv audio data recvfrom error:%d\r\n", errno);break;}}LOGE("threadAudioRecv end\r\n");return 0; }
2.主动监听新来的连接
///////////////////////////////////////////////////////////////////////////////// //1:监听任务 //2:主动连接任务 ///////////////////////////////////////////////////////////////////////////////// static int StartListen(){struct sockaddr_in serveraddr;int connected_len = 0;unsigned long flag = 1;int g_listensocket=-1; g_listensocket = socket( AF_INET ,SOCK_STREAM, 0); if(g_listensocket == -1){LOGD("create g_listensocket error 0x%x",errno);return -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = INADDR_ANY;serveraddr.sin_port = htons(20200);//允许端口重用,防止bind errn:98int on;on = 1;int ret = setsockopt(g_listensocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));if(ret != 0){close(g_listensocket);LOGE( "Socket setsockopt SO_REUSEADDR error %d\r\n", errno);return -1;}ret = bind(g_listensocket, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));LOGD("bind ret=%d",ret);if(ret >= 0){listen(g_listensocket,5); } else{LOGD("bind g_listensocket error 0x%x",errno);closesocket(g_listensocket);g_listensocket = -1;return -1;} #ifdef LJW_DEBUG_LISTENioctlsocket( g_listensocket,FIONBIO,(char*)&flag); #endifreturn g_listensocket;}/** *socket 监听任务 */ int socket_listen_task(void* param){struct sockaddr_in dstaddr;int listensocket = -1;socklen_t addlen = (socklen_t)sizeof(struct sockaddr_in);unsigned long msg[4];unsigned long t_count = 0;listensocket = StartListen();if(listensocket == -1){LOGD("socket_listen_task start error,reboot");system("reboot -f ");return 0;}while(1){int tmp_sock = -1;memset(msg,0,sizeof(unsigned long)*4); LOGD("socket_listen_task wait accept ");if((tmp_sock = accept(listensocket, (struct sockaddr*)&dstaddr,&addlen)) != -1){int ret = 0;msg[0] =tmp_sock; //shr_socket(tmp_sock,socketmanager_task_id);msg[1] = dstaddr.sin_addr.s_addr ;msg[2] = 0;msg[3] =0; t_count++;//发送有新的connect 到socketmanager;if(m_pSocketManager){int ret =0;int type= MSG_NODE_NEW_SOCKET_CLIENT;LOGD("=========MSG_NODE_NEW_SOCKET_CLIENT TYPE===== %d",type);ret = m_pSocketManager->Send_msg(type,(unsigned char*)msg,sizeof(unsigned long)*4);LOGD("接收到网络连接 socket = %lu addr=%lu",msg[0] ,msg[1]);}} else{LOGD("accept ERROR 0x%x",errno);} SDL_Delay(200); //休息200MS,防止连接快速连续。 }closesocket(listensocket);listensocket = -1;return 0;// tmosalTaskExit(); }