20240909-DXSPX-emb/Src/Usr/Task/TcpTask.c

241 lines
6.0 KiB
C

#include "TcpTask.h"
#include "RTCTask.h"
#include "FatfsTask.h"
#include "BSPLwip.h"
#include "lwip/api.h"
#include "lwip/sys.h"
#include "lwip/netdb.h"
#include "lwip/sockets.h"
#include "lwip/inet.h"
#include "lwip/ip_addr.h"
#include "ucos_ii.h"
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define CLIENTPORT 4566
#define SERVERPORT 4567
#define IS_NETCONN 1
#if IS_NETCONN
void ClientTask(void *thread_param)
{
struct netconn *conn;
err_t err;
ip_addr_t server_ip;
const char *message = "I am client";
// static NETWORK_IPADDR ServerIpAddr = {192, 168, 1, 112};
// server_ip.addr = (((uint32_t)ServerIpAddr.Addr0) << 24) |
// (((uint32_t)ServerIpAddr.Addr1) << 16) |
// (((uint32_t)ServerIpAddr.Addr2) << 8) |
// ((uint32_t)ServerIpAddr.Addr3);
IP4_ADDR(&server_ip, 192, 168, 1, 112);
while (1) {
// 创建一个新的 TCP 连接
conn = netconn_new(NETCONN_TCP);
while (conn == NULL) {
conn = netconn_new(NETCONN_TCP);
OSTimeDlyHMSM(0, 0, 1, 0); // 延迟 1 秒后重试
}
conn->recv_timeout = 200;
// 连接到服务器
err = netconn_connect(conn, &server_ip, CLIENTPORT);
if (err != ERR_OK) {
netconn_delete(conn);
OSTimeDlyHMSM(0, 0, 1, 0);
continue;
}
// 每秒向服务器发送数据
while (1) {
err = netconn_write(conn, message, strlen(message), NETCONN_NOCOPY);
if (err != ERR_OK) {
break;
}
OSTimeDlyHMSM(0, 0, 1, 0); // 延迟 1 秒
}
netconn_close(conn);
netconn_delete(conn);
}
}
void ServerCallbackTask(void *thread_param)
{
struct netconn *conn, *newconn;
struct netbuf *buf;
void *data;
u16_t len;
err_t err;
char timeStr[12];
// 创建
conn = netconn_new(NETCONN_TCP);
while (conn == NULL) {
conn = netconn_new(NETCONN_TCP);
OSTimeDlyHMSM(0, 0, 1, 0); // 延迟 1 秒后重试
}
// 绑定
err = netconn_bind(conn, IP_ADDR_ANY, SERVERPORT);
if (err != ERR_OK) {
netconn_delete(conn);
return;
}
// 监听
err = netconn_listen(conn);
if (err != ERR_OK) {
netconn_delete(conn);
return;
}
// 主循环
while (1) {
err = netconn_accept(conn, &newconn);
if (err != ERR_OK) {
continue;
}
// 接受和处理数据
while ((err = netconn_recv(newconn, &buf)) == ERR_OK) {
do {
netbuf_data(buf, &data, &len);
if (len == 7 && strncmp((char *)data, "GET RTC", 7) == 0)
{
sprintf(timeStr, "%02u:%02u:%02u", time.hour, time.minute, time.second);
err = netconn_write(newconn, timeStr, strlen(timeStr), NETCONN_COPY);
}
else
{
err = netconn_write(newconn, data, len, NETCONN_COPY);
}
OSTimeDlyHMSM(0, 0, 1, 0);
if (err != ERR_OK) {
break;
}
} while (netbuf_next(buf) >= 0);
netbuf_delete(buf);
}
netconn_close(newconn);
netconn_delete(newconn);
}
}
#else
void ClientTask(void *thread_param)
{
int sock;
struct sockaddr_in server_addr;
const char *message = "I am client";
int err;
// 设置服务器 IP 地址
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(CLIENTPORT);
inet_aton("192.168.1.112", &server_addr.sin_addr);
while (1) {
// 创建一个新的 TCP 套接字
sock = socket(AF_INET, SOCK_STREAM, 0);
while (sock < 0) {
sock = socket(AF_INET, SOCK_STREAM, 0);
sys_msleep(1000); // 延迟 1 秒后重试
}
// 连接到服务器
err = connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (err < 0) {
close(sock);
sys_msleep(1000); // 延迟 1 秒后重试
continue;
}
// 每秒向服务器发送数据
while (1) {
err = send(sock, message, strlen(message), 0);
if (err < 0) {
break;
}
sys_msleep(1000); // 延迟 1 秒
}
close(sock); // 关闭套接字
}
}
void ServerCallbackTask(void *thread_param)
{
int sock, new_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len;
char buffer[128];
int len;
// char timeStr[12];
// 创建套接字
sock = socket(AF_INET, SOCK_STREAM, 0);
while (sock < 0) {
sock = socket(AF_INET, SOCK_STREAM, 0);
sys_msleep(1000); // 延迟 1 秒后重试
}
// 绑定套接字
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVERPORT);
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
close(sock);
return;
}
// 监听连接
if (listen(sock, 5) < 0) {
close(sock);
return;
}
// 主循环
while (1) {
client_addr_len = sizeof(client_addr);
new_sock = accept(sock, (struct sockaddr *)&client_addr, &client_addr_len);
if (new_sock < 0) {
continue;
}
// 接受和处理数据
while ((len = recv(new_sock, buffer, sizeof(buffer) - 1, 0)) > 0) {
buffer[len] = '\0'; // 确保字符串以 null 结尾
if (len == 7 && strncmp(buffer, "GET RTC", 7) == 0) {
// sprintf(timeStr, "%02u:%02u:%02u", time.hour, time.minute, time.second);
if (send(new_sock, timeStr, strlen(timeStr), 0) < 0) {
break;
}
} else {
if (send(new_sock, buffer, len, 0) < 0) {
break;
}
}
}
close(new_sock); // 关闭客户端套接字
close(sock); // 关闭服务器套接字
}
}
#endif