关于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();
}

 

 

posted @ 2025-02-24 17:17  balder_m  阅读(8)  评论(0)    收藏  举报