使用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 )
函数中设断点并没有执行。请高手指点
striker Qian:
DaemonNew发起的是一个Thread吧,如果你的回调函数dtask_udp_hello 没有收到socket肯定无法进入。在ndk##\packages\ti\ndk\winapps 下有不少发UDP socket的可执行文件,跑代码的时候发一个socket断点就可以停了。
liang he2:
回复 striker Qian:
你好:
我想问一下,要是我想要主动发送数据而不是收到socket以后才处理回应怎么做呢?
striker Qian:
回复 liang he2:
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,里面有示例代码
autstyh autstyh:
回复 liang he2:
你好,可以使用老的创建线程TaskCreate,这样就可以主动发了。DaemonNew是创建一个守护进程,必须先有数据进来才可以发。
希望能帮到你的忙
liang he2:
回复 autstyh autstyh:
非常感谢你的回答,我之前测试了一下这样的操作,确实可以发了,但是发送完毕以后就不能接收了。。。 所以后来我还是决定做服务器端了。
autstyh autstyh:
回复 liang he2:
这个TaskCreate感觉就是只能在知道对方IP下才能正常工作,写一个收进程,和一个发进程。(在知道对方IP的情况下)就可以边收边发了。。。。。守护进程的话只需一次握手,然后就回记录IP了
liang he2:
回复 autstyh autstyh:
谢谢
还要专门写一个收进程?那个收进程怎么写啊?您有示例的代码吗?虽然我没有准备这么写了,但是很想知道这样的操作怎么做,如果您有现成的代码方便分享一下的话就太好了。
autstyh autstyh:
回复 liang he2:
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();
仅供参考,如有雷同,那就雷同吧。
liang he2:
回复 autstyh autstyh:
大神你好,太感谢了。。
如有雷同必是我抄你的……
autstyh autstyh:
回复 liang he2:
此问题还没有答案么?。。。