This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

daemonnew函数问题

使用NDk中自带的helloworld工程

do

   {

       rc = NC_NetStart( hCfg, NetworkOpen, NetworkClose, NetworkIPAddr );

   } while( rc > 0 );

语句执行了。

static void NetworkOpen()

{

   // Create our local server

   hHello = DaemonNew( SOCK_DGRAM, 0, 7, dtask_udp_hello,

                      OS_TASKPRINORM, OS_TASKSTKNORM, 0, 1 );

}这个语句设断点也执行了

但是在dtask_udp_hello( SOCKET s, UINT32 unused )

函数中设断点并没有执行。请高手指点

  • DaemonNew发起的是一个Thread吧,如果你的回调函数dtask_udp_hello 没有收到socket肯定无法进入。在ndk##\packages\ti\ndk\winapps 下有不少发UDP socket的可执行文件,跑代码的时候发一个socket断点就可以停了。

  • 你好:

    我想问一下,要是我想要主动发送数据而不是收到socket以后才处理回应怎么做呢?

  • Hi,

    直接发送更加容易,

    直接作为client端配置UDP/TCP 包发送,参考以下路径

    C:\ti\ndk_2_21_01_38\packages\ti\ndk\tools\console 是个看源代码的好地方,应该有client段示例

    C:\ti\ndk_2_21_01_38\packages\ti\ndk\inc\serrno.h 可以看各种fderror的错

    C:\ti\ndk_2_21_01_38\packages\ti\ndk\tools\servers各种udp、tcp server都在里面
    或者参考spru524,里面有示例代码
  • 你好,可以使用老的创建线程TaskCreate,这样就可以主动发了。DaemonNew是创建一个守护进程,必须先有数据进来才可以发。

    希望能帮到你的忙

  • 非常感谢你的回答,我之前测试了一下这样的操作,确实可以发了,但是发送完毕以后就不能接收了。。。 所以后来我还是决定做服务器端了。

  • 这个TaskCreate感觉就是只能在知道对方IP下才能正常工作,写一个收进程,和一个发进程。(在知道对方IP的情况下)就可以边收边发了。。。。。守护进程的话只需一次握手,然后就回记录IP了

  • 谢谢

    还要专门写一个收进程?那个收进程怎么写啊?您有示例的代码吗?虽然我没有准备这么写了,但是很想知道这样的操作怎么做,如果您有现成的代码方便分享一下的话就太好了。

  • void tskRcvData(IPN un32ServerIpAddr, UINT16 un16UdpServerPort, Uint8 u8ServerID)
    {
        Uint32    u32RcvUdpBufLen;
        Uint32     u32RcvBufSize;
        //Uint8*  u8RxTmpBuf;
        Uint8*  u8AppBuf;
        SOCKET     s = INVALID_SOCKET;
        struct     sockaddr_in ServerAddr;    
        //Uint32 i = 0;
        //Uint32 *Dst = (Uint32 *)0xA0000000;

        while( !NDK_state)
        {
            TSK_sleep(100);
        }
        // Allocate the file descriptor environment for this task
        fdOpenSession((HANDLE)TSK_self());

        // Create UDP socket
        s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (s == INVALID_SOCKET)
        {
            printf("failed socket creation (%d)\n", fdError());
            goto LEAVE;
        }

        bzero(&ServerAddr, sizeof(struct sockaddr_in));
        ServerAddr.sin_family           = AF_INET;
        ServerAddr.sin_len               = sizeof(ServerAddr);
        ServerAddr.sin_addr.s_addr     = un32ServerIpAddr;
        ServerAddr.sin_port           = htons(un16UdpServerPort);

        //configure the receive buffer size
        u32RcvBufSize =TC3_4_BYTE_SRC_REQ*10;// bufsize
        setsockopt(s, SOL_SOCKET, SO_RCVBUF, &u32RcvBufSize, sizeof(UINT32) );

        // Bind server address
        if (bind(s, &ServerAddr, sizeof(ServerAddr)) < 0)
        {
            printf("bind failed (%d)\n", fdError());
            goto LEAVE;
        }

        while(1)
        {        
            // receiving data from servers
            SEM_pendBinary(g_semUdp, SYS_FOREVER);

            for(i=0;i<10;i++)
            {
                if(i == 0)
                {    
                    //timestart1 = CLK_gethtime();
                }

                u32RcvUdpBufLen = recvfrom(s, (void *)g_u8AppBuf_Tmp,g_u16mpdu_size_byte , MSG_WAITALL, NULL, NULL);    //g_u16mpdu_size_byte
                
                if(i == 0)
                {    
                    //timestart2 = CLK_gethtime();
                }

                if (u32RcvUdpBufLen == TC3_4_MPDU_SIZE_BYTE)
                    mcs = 2;
                else if(u32RcvUdpBufLen == TC1_2_MPDU_SIZE_BYTE)
                    mcs = 1;
                else if(u32RcvUdpBufLen == TC1_3_MPDU_SIZE_BYTE)
                    mcs = 0;
                else if(u32RcvUdpBufLen == APP_CONTROL_MPDU)
                {
                    mcs = g_pu8AppBuf_PC[2];            //Tx MCS

                    //g_mcsTx = mcs;

                    //g_bRxBufMpduFlag_A[10] = mcs;
                    //g_bRxBufMpduFlag_B[10] = mcs;
                }
                else
                    continue;

                if(g_mcsTx != mcs)
                {
                    g_mcsTx = mcs;
                    SystemInit(g_mcsTx);
                }
                    
                //    u8RxTmpBuf = (Uint8 *)(g_pu8AppBuf_PC);
                u8AppBuf = (Uint8 *)(g_pu8AppBuf_PC + u32RcvUdpBufLen*i);

                pPaRAMSet34->m_wSRC = (Uint32)g_u8AppBuf_Tmp;
                pPaRAMSet34->m_wDST = (Uint32)u8AppBuf;    
                pPaRAMSet34->m_hwACNT = u32RcvUdpBufLen;    

                *pu32ESRH = 1<<(TCC34-32);
                
                if(9 == i)
                {
                    //i = 0;
                    u8AppBuf = (Uint8 *)(g_pu8AppBuf_PC);
                /*
                    timeend1 = CLK_gethtime();
                    timepay[numbers] = (float)((timeend1 - timestart1)*0.000001);
                    timepay1[numbers] = (float)((timeend1 - timestart2)*0.000001);
                    time_save[numbers] = (float)((timeend1 - time_start)*0.000001);
                    numbers++;
                    if (numbers == 100)
                    {
                        numbers = 0;
                    }
                */
                    SEM_postBinary(semFrameProc);                
                }
            }
        } //while(1)



    LEAVE:
        if (s != INVALID_SOCKET)
        {
            fdClose(s);
        }
        fdCloseSession((HANDLE)TSK_self());
        TSK_exit();

    }

    LEAVE:
        if (s != INVALID_SOCKET)
        {
            fdClose(s);
        }
        fdCloseSession((HANDLE)TSK_self());
        TSK_exit();

    仅供参考,如有雷同,那就雷同吧。

  • 大神你好,太感谢了。。

    如有雷同必是我抄你的......

  • 此问题还没有答案么?。。。

  • 你好,我想请教一下你,你是怎么做的。让daemonnew这个函数里面的dtask_udp_hello函数工作的?谢谢

  • 您好,我现在也要做网络通信的,但是socket这里一直跑飞,您这个适用于tcp么?

  • 你好,能不能麻烦您介绍一下DaemonNew和Task_create的具体区别?