DSP 开发例程(5): tcp_server

目录

  • 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

DSP 开发例程(5): tcp_server_第1张图片

  • 选择 Existing CCS Eclipse Projects, 点击 Next.

DSP 开发例程(5): tcp_server_第2张图片

  • 点击 Browse, 选择 mcsdk_###_#\examples 所在目录, 勾选 helloworld_evmc6678l 工程, 勾选 Copy projects into workspace, 点击 Finish.
    DSP 开发例程(5): tcp_server_第3张图片
  • 复制 mcsdk_###_#\examples\ndk\helloWorld 目录下的四个 .c 源文件.
    DSP 开发例程(5): tcp_server_第4张图片- 选择刚导入的工程, 右键选择: Paste, 粘贴刚刚复制的四个 .c 源文件到此工程中. 在弹出的 Question 对话框中点击 Yes To All, 完成替换.

DSP 开发例程(5): tcp_server_第5张图片
DSP 开发例程(5): tcp_server_第6张图片

  • 将此工程重命名为: tcp_server.

DSP 开发例程(5): tcp_server_第7张图片
DSP 开发例程(5): tcp_server_第8张图片

源码编辑

tcp_echo.c

  • 新建名为 tcp_echo.c 的源文件.
    DSP 开发例程(5): tcp_server_第9张图片

DSP 开发例程(5): tcp_server_第10张图片

  • 文件内容如下:
#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 节 中找到.

helloWorld.c

  • 打开 helloWorld.c 文件.
  • 在其中添加 dtask_tcp_echo() 的外部声明.
extern int dtask_tcp_echo(SOCKET s, UINT32 unused);

DSP 开发例程(5): tcp_server_第11张图片

  • 修改 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 );
}

DSP 开发例程(5): tcp_server_第12张图片

  • 查看计算机的以太网IP, 将 开发板的IP 修改到同一个网段.(此例程中, 我的IP为192.168.0.11).
    DSP 开发例程(5): tcp_server_第13张图片
    保存上述修改, 并编译工程.

调试

  • EVM6678L 开发板 通过网线与 计算机连接.
  • 连接仿真器.
  • 开发板上电, 导入程序并运行. 此时在 Console 窗口能看到如下信息.
    DSP 开发例程(5): tcp_server_第14张图片
  • 打开 命令提示符 窗口, 运行 ping 命令, 查看与开发板的网络连接是否正常.
    DSP 开发例程(5): tcp_server_第15张图片
  • 打开 tera term, 选择 TCP/IP连接, 修改 HostLocalIPAddr设置的地址, TCP端口设置为 7. (也可以使用 putty 或其他测试工具进行连接.)

DSP 开发例程(5): tcp_server_第16张图片

  • 选择菜单: Setup | Terminal, 勾选 Local echo.
    DSP 开发例程(5): tcp_server_第17张图片
  • 在终端中输入一串字符后回车, 可以看到 开发板 TCP 服务进程回传的字符串.自此说明 TCP Server 能够正常运行.
    DSP 开发例程(5): tcp_server_第18张图片

说明

  • DaemonNew() 的第三个参数为 监听端口, 我们可以修改它来指定服务器端口.

你可能感兴趣的:(DSP,DSP,tcp/ip)