TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] CCS/TMS320C6670:具有 NDK 库的 TCP 服务器

Guru**** 2046970 points
Other Parts Discussed in Thread: TMS320C6670
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/801836/ccs-tms320c6670-tcp-server-with-ndk-library

器件型号:TMS320C6670

工具/软件:Code Composer Studio

您好!

我将具有 TMS320C6670和 NDK-lib 的 DSP 板用于以太网。

使用 HelloWorld 示例、我实现了 UDP 协议。

但现在的挑战是基于 NDK 库创建 TCP 服务器。

您能举个例子来创建这样的服务器吗?  因为我在使用 NDK 库实现这样的服务器时遇到了一些问题。

谢谢。

此致。 亚历山大

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    检查以下 E2E 主题:
    e2e.ti.com/.../591323

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我跟踪了此对话及其所有链接。
    遗憾的是,这些链接中没有 TCP/IP 服务器示例。 仅 UDP。
    文中提到了 dtask_tcp_echo 函数、但不会在任何地方提供该函数。

    此致、Alexander
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    没有提供 TCP 服务器示例、您可以使用 Nimu 示例作为参考。 并使用 NDK 开发人员指南(www.ti.com/.../spru524k.pdf )第5.4节“TCP/UDP 服务器守护程序支持”创建您的应用程序。

    另外、NDK 常见问题解答 :processors.wiki.ti.com/.../Network_Developers_Kit_FAQ 以及 Processor SDK RTOS 用户指南: software-dl.ti.com/.../index_Foundational_Components.html 也应对您有用。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我理解。 我做到了。
    谢谢你。
    我想澄清细节、所以我想找一个示例。
    因为我不太了解 TCP 协议的 NDK 库的功能。 例如、就函数的工作而言、在阻塞和非阻塞模式下接受、读取、发送。
    但我会尝试自己解决它。
    谢谢你。

    此致、Alexander
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉!  但到目前为止、我遇到了 NDK TCP 服务器问题。

    我尝试使用 TCP/UDP 服务器守护程序支持(如 spru524第5.4节)

    如文档中的示例所示:

    Hecho = DemonNew (sock_STREAMNC、0、7、dtask_tcp_echo、os_TASKPRINORM、 OS_TASKSTKNORM,0,3);

    和 回调 func:

    int dtask_tcp_echo (socket s、uint32未使用)

    结构时间 val 至;
    int i;
    char *pBuf;
    句柄 hBuffer;
    (无效)未使用;
    //将套接字超时配置为5秒
    TO.tv_sec = 5;
    TO.tV_usec = 0;
    setsockopt( s, SOL_socket , SO_SNDTIME,&TO, sizeof(至));
    setsockopt( s、SOL_socket、SO_RCVTIMEO、&to、sizeof (to));
    I = 1;
    setsockopt( s、IPPROTO_TCP、tcp_NOPUSH、&I、4);
    for (;;)

    i =(int)recvnc( s,( void **)&pBuf,0&hBuffer );
    //如果我们读取数据,则将其回显
    如果(I > 0)

    if (send( s、pBuf、I、0)< 0)
    中断;
    recvncfree( hBuffer);

    //如果连接出现错误或断开,请关闭
    其他
    中断;

    fdClose (s);
    //返回"0",因为我们关闭了套接字
    返回(0);



    如文档(spru524)中所述、这就足够了。 如果客户端尝试建立连接, 则将调用函数 dtask_tcp_echo()。

    但不会!

    在我的客户端程序(PC、Wind10)中,我尝试:

    sock = socket (AF_iNet、SOCK_STREAM、0);

    (笑声)

    代码= connect (sock、(struct sockaddr *)&servAddr、sizeof (struct servAddr);

    如果(代码<0)

    //错误

    (笑声)

    (笑声)

     

    结构伺服地址 正确!  

    但它没有连接。

    代码=-1 (错误)

    我的回调 func dtask_tcp_echo()在 DSP 中没有调用。  

    怎么了?

    也许从服务器方面,我需要运行 listen() Accept()?   但是 spru524 sec5.4  说守护程序自己完成它。 还是否?

    请回答。

    此致、Alexander

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

    [引用]也许在服务器端,我需要运行 listen() Accept()?   但是 spru524 sec5.4  说 Daemon 自己做[/引述]

    是的、情况应该是这样。 让我进一步检查一下。

    此致、
    Yordan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试使用  listen() 和  Accept()。 但它不起作用。

    首先,此函数需要使用套接字(套接字)的底数作为参数 。 守护程序不会将其返回

    Hecho = DemonNew (sock_STREAMNC、0、7、dtask_tcp_echo、os_TASKPRINORM、 OS_TASKSTKNORM,0,3);.

    hecho 是守护进程对象的理想器,而不是套接字的解字符

    守护进程在回调 func 中返回套接字中断

    int dtask_tcp_echo (socket s、uint32未使用)

    但是对于回调 func、必须   执行 listen()和 Accept()。

    这里是问题。  这些函数在哪里调用?   它通常称为某个位置吗?

     还有更多问题。

    对于 TCP 服务器和 TCP 客户端,调用 DemonNew()的区别是什么?

    因为,对于 TCP 客户端,我需要调用  connect()函数 ,而不是函数  listen() 和  Accept()。  或守护程序必须自行执行。

    但 Daemon 能 做到吗?

     

    此致、Alexander

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    C6670在 Processor SDK RTOS 中不再受支持、但对于 NDK 器件、您可以使用相同的器件。 对于 C6678、有 NIMU_emacClientExample_EVMC6678C66BiosExampleProject。 这个打开了守护程序:

    静态空 NIMU_testNetworkOpen()

    //创建我们的本地服务器
    hecho = DemonNew (sock_stREAMNC、0、7、dtask_tcp_echo、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hEchoUdp = DemonNew (SOCK_DGRAM、0、7、dtask_udp_echo、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、1);
    hData = DemonNew (sock_stream、0、1000、dtask_tcp_datasrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hNull = DemonNew (SOCK_STREAMNC、0、1001、dtask_tcp_nullsrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hOob = DemonNew (SOCK_STREAMNC、0、999、dtask_tcp_oobsrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);

    。}

    其中 dtask_tcp_echo 是您要查找的内容。 此项目可以运行 DHCP 或静态 IP。 然后、您可以使用 NDK 包\ti\NDK\winapps 对其进行测试。 recv、send 和 echoc 使用 TCP/IP 协议。 我刚刚测试过、他们都能正常工作。 可以在 daemon ()、listen()、NDK_Accept()、NDK_Listen()等中设置断点。 函数来查看如何在 NDK 封装内调用它们。

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果我理解正确,函数 Listen()、NDK_Accept()、NDK_Listen()等... 在守护程序内部调用。  

    我自己不应该在任何地方给他们打电话

    我所要做的就是  

    //创建本地服务器
    Hecho = DemonNew (sock_STREAMNC、0、7、  dtask_tcp_echo、  os_TASKPRINORM、 OS_TASKSTKNORM,0,3);

    ///确定我的 callbackFunc

    int dtask_tcp_echo (socket s、uint32未使用)
    {...}   
       

    此外、我 必须 在 配置文件 xxxx.cfg 中打开并描述 TCP 服务

    满足所有需求。

    好的。  

    此方案运行良好、我已经使用过、但对于 UDP 协议:

    hEchoUdp = DemonNew (SOCK_DGRAM、0、7、  dtask_udp_echo、  OS_TASKPRINORM、 OS_TASKSTKNORM,0,1);

    (笑声)

    int dtask_udp_echo (socket s、uint32未使用)

    我使用此 UDP 已有很长时间。

    但 TCP 服务器不起作用。  与 TCP 客户端没有连接。  尽管我使用的 TCP 客户端与其他 TCP 服务器配合使用良好。

    这可能是因为我有一个处理器6670 (而不是6678)?

    和...

    在这里

    静态空 NIMU_testNetworkOpen()

    //创建我们的本地服务器
    hecho = DemonNew (sock_stREAMNC、0、7、dtask_tcp_echo、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hEchoUdp = DemonNew (SOCK_DGRAM、0、7、dtask_udp_echo、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、1);
    hData = DemonNew (sock_stream、0、1000、dtask_tcp_datasrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hNull = DemonNew (SOCK_STREAMNC、0、1001、dtask_tcp_nullsrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hOob = DemonNew (SOCK_STREAMNC、0、999、dtask_tcp_oobsrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);

    。}


    守护程序如何知道它需要打开 TCP 服务器而不是 TCP 客户端,并使用内部 函数 listen()和 Accept(),而不是 connect()?

    甚至可以通过守护程序构建 TCP 客户端吗?

    此致、Alexander

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    NDK 独立于硬件级别。 因此、使用 C6670和 C6678应该是相同的。 我昨天在客户端示例中试用了 C6678、这对我来说非常适合 UDP 和 TCP、您可以测试发送、recv 和 echoc 的 TCP。 对于 UDP、您可以使用 helloworld 和 testudp 进行测试。

    您认为接受、收听、连接在守护程序内部被调用是正确的,您的应用程序不需要调用它们。

    对于"

    守护程序如何知道它需要打开 TCP 服务器而不是 TCP 客户端,并使用内部 函数 listen()和 Accept(),而不是 connect()?

    甚至可以通过守护程序构建 TCP 客户端吗?"

    让我与同事核实一下。

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    守护程序是服务器。 它不能是客户端(例如,它永远不会调用 connect())。  

    Todd