服务设施软件
代码复用
将网络通讯框架移植到开发板,之后,可应用框架中的组件实现 Response Task
和 Server 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 Task
和 Server Task
的业务逻辑如何实现?客户端如何实现?