Browse Source

【主线待合】实现了真正意义上的talnet终端,而不是依赖回显方式

master
Lizongdi 1 week ago
parent
commit
c08324721b
  1. 52
      bspMCU/My_Lwip.c

52
bspMCU/My_Lwip.c

@ -59,6 +59,11 @@
*----------------------------------------------*/ *----------------------------------------------*/
#define PORT 23 // 监听的端口号 #define PORT 23 // 监听的端口号
#define RECV_SIZE 1024 // 接收缓冲区大小 #define RECV_SIZE 1024 // 接收缓冲区大小
#define IAC 255
#define WILL 251
#define DO 253
#define ECHO 1
#define SGA 3
static int connect_fd = -1; //socket套接字 static int connect_fd = -1; //socket套接字
#if 0 #if 0
@ -142,7 +147,20 @@ void luaprint_talnet(const char *fmt, ...)
va_end(args); va_end(args);
if (len > 0 && connect_fd >= 0) if (len > 0 && connect_fd >= 0)
{ {
write(connect_fd, temp, len); // 将 \n 转换为 \r\n,分段发送
int start = 0;
for (int i = 0; i < len; i++)
{
if (temp[i] == '\n')
{
if (i > start)
write(connect_fd, &temp[start], i - start);
write(connect_fd, "\r\n", 2);
start = i + 1;
}
}
if (start < len)
write(connect_fd, &temp[start], len - start);
} }
} }
@ -200,20 +218,13 @@ void vTCPServer_Task(void *pvParameters)
#ifdef USE_TALNET #ifdef USE_TALNET
lua_init(luaprint_talnet); lua_init(luaprint_talnet);
// 发送telnet协商:服务端负责回显,进入字符模式
unsigned char telnet_neg[] = {
IAC, WILL, ECHO,
IAC, WILL, SGA
};
write(connect_fd, telnet_neg, sizeof(telnet_neg));
#endif #endif
// // 第一条指令:要求客户端关闭本地回显,交由服务器处理
// unsigned char cmd_echo[] = { 255, 254, 1 };
// // IAC(255) DO(253) ECHO(1)
//
// // 第二条指令:禁用“前进抑制”,强制进入实时字符流模式
// unsigned char cmd_sga[] = { 255, 254, 3 };
// // IAC(255) DO(253) SUPPRESS-GO-AHEAD(3)
//
// write(connect_fd, cmd_echo, sizeof(cmd_echo));
// write(connect_fd, cmd_sga, sizeof(cmd_sga));
// int enable = 1; // 1 表示启用 TCP_NODELAY(即禁用 Nagle 算法)
// setsockopt(connect_fd, IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(enable));
// 打印连接的客户端 IP 和端口 // 打印连接的客户端 IP 和端口
log_i("New client connected: %s:%d\r\n", log_i("New client connected: %s:%d\r\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
@ -230,20 +241,9 @@ void vTCPServer_Task(void *pvParameters)
if (ret > 0) if (ret > 0)
{ {
#ifdef USE_TALNET #ifdef USE_TALNET
lua_repl(temp, ret, 0); lua_repl(temp, ret, 1);
#else #else
write(connect_fd, temp, ret); write(connect_fd, temp, ret);
#endif
#if 0
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE)
{
int iLen = rd_RingbufferPutForce(g_rb_handle, &temp, ret);
xSemaphoreGive(xMutex);
if (iLen > 0)
{
xSemaphoreGive(xSemaphore);
}
}
#endif #endif
} }
else if (ret == 0) else if (ret == 0)

Loading…
Cancel
Save