关于socket的管理
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:98 int 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); } else break; }
接收数据
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:98 int 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_LISTEN ioctlsocket( g_listensocket,FIONBIO,(char*)&flag); #endif return 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(); }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号