服务设施软件

代码复用

将网络通讯框架移植到开发板,之后,可应用框架中的组件实现 Response TaskServer Task

框架移植注意事项

  • Lwip 是微型 TCP/IP 协定栈 (并非残缺 TCP/IP协定栈)
  • 反对 socket 接口,但一些性能未实现
  • socket 接口所在头文件不同于 Linux 和 Window 平台
  • 实现可执行测试,对测试中呈现的问题及时修复

可执行性测试

  • 通过网络调试助手验证 TCP 数据首发

    • 设施运行服务端,客户端连贯,数据收发性能
  • 通过网络调试助手验证 UDP 数据收发

    • 设施端接管播送,并复原数据

Server Task 要害实现

static void EventListener(TcpClient* client, int evt){    if( evt == EVT_CONN )    {        printf("%s : CONN - %p...\n", __FUNCTION__, client);    }    else if( evt == EVT_DATA )    {        Message* msg = NULL;        printf("%s : DATA - %p...\n", __FUNCTION__, client);        msg = TcpClient_RecvMsg(client);        if( msg )        {            printf("%s : msg = %p\n", __FUNCTION__, msg);            printf("%s : msg->type = %d\n", __FUNCTION__, msg->type);            printf("%s : msg->cmd = %d\n", __FUNCTION__, msg->cmd);        }        free(msg);    }    else if( evt == EVT_CLOSE )    {        printf("%s : CLOSE - %p...\n", __FUNCTION__, client);    }}void* Service_Task(const char* arg){    TcpServer* server = TcpServer_New();    printf("%s : enter service task...\n", __FUNCTION__);    if( server )    {        printf("%s : server = %p\n", __FUNCTION__, server);        TcpServer_SetListener(server, EventListener);        TcpServer_Start(server, 8888, 10);        TcpServer_DoWork(server);    }    return arg;}

Respone Task 要害实现

void* Response_Task(const char* arg){    UdpPoint* udp = UdpPoint_New(9999);    printf("%s : enter response task...\n", __FUNCTION__);    if( udp )    {        char remote[16] = {0};        int port = 0;        printf("%s : udp = %p\n", __FUNCTION__, udp);        while( 1 )        {            Message* msg = UdpPoint_RecvMsg(udp, remote, &port);            if( msg )            {                printf("%s : msg = %p\n", __FUNCTION__, msg);                printf("%s : remote = %s\n", __FUNCTION__, remote);                printf("%s : port = %d\n", __FUNCTION__, port);                printf("%s : msg->type = %d\n", __FUNCTION__, msg->type);                printf("%s : msg->cmd = %d\n", __FUNCTION__, msg->cmd);            }            else            {                printf("%s : msg is NULL...\n", __FUNCTION__);            }            free(msg);        }    }    return arg;}

编程试验,网络通讯框架移植

main.c

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>#include "response_task.h"#include "server_task.h"int main(void){    int ret;    pthread_t tid1;    pthread_t tid2;    ret = pthread_create(&tid1, NULL, Response_Task, NULL);    if (ret != 0) {        printf("[dt4sw] Failed to create response task!\n");    }    ret = pthread_create(&tid2, NULL, Service_Task, NULL);    if (ret != 0) {        printf("[dt4sw] Failed to create service task!\n");    }    pthread_join(tid1,NULL);    pthread_join(tid2,NULL);    return 0;}

response_task.h

#ifndef RESPONSE_TASK_H#define RESPONSE_TASK_Hvoid* Response_Task(void* arg);#endif  // RESPONSE_TASK_H

response_task.c

#include "response_task.h"#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include "udp_point.h"void* Response_Task(void* arg){    UdpPoint *udp = UdpPoint_New(9999);    printf("%s : enter response task ...\n", __FUNCTION__);    if (udp) {        char remote[16] = {0};        int port = 0;        printf("%s : udp = %p\n", __FUNCTION__, udp);        while (1) {            Message *msg = UdpPoint_RecvMsg(udp, remote, &port);            if (msg) {                printf("%s : msg = %p\n", __FUNCTION__, msg);                printf("%s : remote = %s\n", __FUNCTION__, remote);                printf("%s : port = %d\n", __FUNCTION__, port);                printf("%s : msg->type = %d\n", __FUNCTION__, msg->type);                printf("%s : msg->cmd = %d\n", __FUNCTION__, msg->cmd);            } else {                printf("%s : msg is NULL ...\n", __FUNCTION__);            }            free(msg);        }    }    return arg;}

server_task.h

#ifndef SERVER_TASK_H#define SERVER_TASK_Hvoid* Service_Task(void* arg);#endif // SERVER_TASK_H

server_task.c

#include "server_task.h"#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include "tcp_server.h"static void EventListener(TcpClient *client, int evt){    if (evt == EVT_CONN) {        printf("%s : CONN - %p ...\n", __FUNCTION__, client);    } else if (evt == EVT_DATA) {        Message *msg = NULL;        printf("%s : data -%p ...\n", __FUNCTION__, client);        msg = TcpClient_RecvMsg(client);        if (msg) {            printf("%s : msg = %p\n", __FUNCTION__, msg);            printf("%s : msg->type = %d\n", __FUNCTION__, msg->type);            printf("%s : msg->cmd = %d\n", __FUNCTION__, msg->cmd);        }        free(msg);    } else if (evt == EVT_CLOSE) {        printf("%s : CLOSE - %p ... \n", __FUNCTION__, client);    }}void* Service_Task(void* arg){    TcpServer *server = TcpServer_New();    printf("%s : enter server task ...\n", __FUNCTION__);    if (server) {        printf("%s : server = %p\n", __FUNCTION__, server);        TcpServer_SetListener(server, EventListener);        TcpServer_Start(server, 8888, 10);        TcpServer_DoWork(server);    }    return arg;}

课后思考

Response TaskServer Task 的业务逻辑如何实现?客户端如何实现?