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.
工具/软件:Code Composer Studio
您好!
我将具有 TMS320C6670和 NDK-lib 的 DSP 板用于以太网。
使用 HelloWorld 示例、我实现了 UDP 协议。
但现在的挑战是基于 NDK 库创建 TCP 服务器。
您能举个例子来创建这样的服务器吗? 因为我在使用 NDK 库实现这样的服务器时遇到了一些问题。
谢谢。
此致。 亚历山大
抱歉! 但到目前为止、我遇到了 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