目录
- DSP 开发例程(5): tcp_server
- 创建工程
- 源码编辑
- tcp_echo.c
- helloWorld.c
- 调试
- 说明
DSP 开发例程(5): tcp_server
此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程(0): 汇总查看其他例程说明.
创建工程
此例程在官方提供的UDP通信例程基础上修改.
- 在 Project Explorer 视图中, 右键选择: Import
- 选择 Existing CCS Eclipse Projects, 点击 Next.
- 点击 Browse, 选择 mcsdk_###_#\examples 所在目录, 勾选 helloworld_evmc6678l 工程, 勾选 Copy projects into workspace, 点击 Finish.
- 复制 mcsdk_###_#\examples\ndk\helloWorld 目录下的四个 .c 源文件.
- 选择刚导入的工程, 右键选择: Paste, 粘贴刚刚复制的四个 .c 源文件到此工程中. 在弹出的 Question 对话框中点击 Yes To All, 完成替换.
- 将此工程重命名为: tcp_server.
源码编辑
tcp_echo.c
- 新建名为 tcp_echo.c 的源文件.
- 文件内容如下:
#include <ti/ndk/inc/netmain.h>
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 节 中找到.
helloWorld.c
- 打开 helloWorld.c 文件.
- 在其中添加
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 );
}
- 查看计算机的以太网IP, 将 开发板的IP 修改到同一个网段.(此例程中, 我的IP为
192.168.0.11
).
保存上述修改, 并编译工程.
调试
- 将 EVM6678L 开发板 通过网线与 计算机连接.
- 连接仿真器.
- 开发板上电, 导入程序并运行. 此时在 Console 窗口能看到如下信息.
- 打开 命令提示符 窗口, 运行
ping
命令, 查看与开发板的网络连接是否正常.
- 打开 tera term, 选择 TCP/IP连接, 修改 Host 为
LocalIPAddr
设置的地址, TCP端口设置为7
. (也可以使用 putty 或其他测试工具进行连接.)
- 选择菜单: Setup | Terminal, 勾选 Local echo.
- 在终端中输入一串字符后回车, 可以看到 开发板 TCP 服务进程回传的字符串.自此说明 TCP Server 能够正常运行.
说明
DaemonNew()
的第三个参数为 监听端口, 我们可以修改它来指定服务器端口.