请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:F28M36P63C2 工具/软件:TI-RTOS
我正在F28M36P63C2上评估TI-RTOS/NDK,并且在使用recvnc时遇到问题。 我从TCP echo示例开始,该示例有效,然后修改了tcpWorker()任务,如下所示使用recvnc()而不是recv():
/*
========= tcpWorker =========
*处理TCP连接的任务。 可以是多个正在运行的任务
*此函数。
*/
void tcpWorker (UArg arg0,UArg arg1)
{
socket clientfd =(socket) arg0;
int nbytes;
布尔标志= true;
char *buffer;
错误块EB;
IF (fdOpenSession(TaskSelf))==0)
{
system_printf ("tcpWorker:clientfd = 0x%x\n",clientfd的会话错误);
}
否则
{
system_printf("tcpWorker: start clientfd = 0x%x\n", clientfd);
}
/*确保Error_Block已初始化*/
ERROR_INIT(&E);
uINT32_t received_bytes=0;
#ifndef no_copy
/*获取缓冲区以接收传入的数据包。 使用默认堆。 */
缓冲区= Memory_alloc (NULL,TCPPACKETSZE,0,&EB);
如果(缓冲区== NULL){
system_printf("tcpWorker:无法分配内存\n");
task_exit();
}
#否则
句柄hBuffer;
#endif
/*接收数据时循环*/
while (flag){
#ifdef no_copy
nbytes = recvnc(clientfd,(void **)&buffer, 0,&hBuffer);
#else
nbytes = recv (clientfd,buffer,TCPPACKETSIZE,0);
#endif
如果(nbytes > 0){
/*回显数据*/
// send(clientfd,(car *)缓冲区, nbytes,0);
received_bytes += nbytes;
#ifdef no_copy
recvncfree (hBuffer);
#endif
}
否则{
如果(nbytes < 0)
{
system_printf ("套接字错误%d\n",fdError());
}
fdClose(clientfd);
标志= false;
}
}
system_printf ("tcpWorker stop clientfd = 0x%x,收到%d字节\n",clientfd,received_bytes);
#ifndef no_copy
/*将缓冲区释放回堆*/
MEMORY_FREE (NULL,BUFFER,TCPPACKETSIZE);
#endif
fdCloseSession (TaskSelf ());
system_flush();
/*
*由于在cfg文件中设置了deleteTerminatedTasks,
*空闲任务运行时,任务将被删除。
*/
task_exit();
}
我正在测试连接到Concerto的iperf v2,以测量最大接收速率。 如果未定义NO_COPY宏,iperf将运行到完成,并且我将获得测试完成且连接关闭后在调试控制台中接收到的字节总数。 但是,当定义no_copy时,recvnc()在启动工作任务后立即返回-1,并且fderror给出错误22 (无效参数),尽管iperf会继续发送数据,这意味着NDK仍在对数据进行寻叠。
这是默认的NDK设置,我也尝试增加缓冲区大小等,尽管我在控制台中没有收到任何oom错误。
是否有一个使用recvnv()的尝试和测试过的示例?