此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程(0): 汇总查看其他例程说明.
此例程在官方提供的UDP通信例程基础上修改.
#include
int dtask_tcp_echo(SOCKET s, UINT32 unused)
{
struct timeval to;
int I;
char *pBuf;
HANDLE hBuffer;
(void)unused;
// Configure our socket timeout to be 5 seconds
to.tv_sec = 5;
to.tv_usec = 0;
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof(to));
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);
// If we read data, echo it back
if (I > 0)
{
if (send(s, pBuf, I, 0) < 0)
break;
recvncfree(hBuffer);
}
// If the connection got an error or disconnect, close
else
break;
}
fdClose(s);
// Return "0" since we closed the socket
return (0);
}
其中, dtask_tcp_echo()
完成 TCP 数据的收发.
这段代码可以在 ti\ndk_###_#\docs\spru524i.pdf 的 5.4.2 节 中找到.
dtask_tcp_echo()
的外部声明.extern int dtask_tcp_echo(SOCKET s, UINT32 unused);
NetworkOpen()
函数, 将 dtask_udp_hello()
函数句柄添加到守护进程中.static void NetworkOpen()
{
// Create our local server
hHello = DaemonNew( SOCK_STREAMNC, 0, 7, dtask_tcp_echo,
OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
// hHello = DaemonNew( SOCK_DGRAM, 0, 7, dtask_udp_hello,
// OS_TASKPRINORM, OS_TASKSTKNORM, 0, 1 );
}
ping
命令, 查看与开发板的网络连接是否正常.LocalIPAddr
设置的地址, TCP端口设置为 7
. (也可以使用 putty 或其他测试工具进行连接.)DaemonNew()
的第三个参数为 监听端口, 我们可以修改它来指定服务器端口.