strcmp比较下注预定义和接收字符串
这是一个mplab和谐代码,我试图在客户端接收数据,我想从服务器套接字控制LED,文本“开始”将打开LED,“停止”将关闭LED,当我调试代码时,它显示Appbuffer[80]具有所有空变量,ACK[]=最后一个变量为空\0,在AOK[]中相同.我想知道这是否是比较字符串的正确方法,正如我在这里的代码中所写的那样。因为当我调试代码时,它会跳过这一行并跳转到服务器任务init()。请帮帮我strcmp比较下注预定义和接收字符串,c,arrays,string,debugging,C,Arrays,String,Debugging,这是一个mplab和谐代码,我试图在客户端接收数据,我想从服务器套接字控制LED,文本“开始”将打开LED,“停止”将关闭LED,当我调试代码时,它显示Appbuffer[80]具有所有空变量,ACK[]=最后一个变量为空\0,在AOK[]中相同.我想知道这是否是比较字符串的正确方法,正如我在这里的代码中所写的那样。因为当我调试代码时,它会跳过这一行并跳转到服务器任务init()。请帮帮我 case APP_TCPIP_WAIT_FOR_RESPONSE: { char Appbuf
case APP_TCPIP_WAIT_FOR_RESPONSE:
{
char Appbuffer[80];
static const char ACK[]="START";
static const char AOK[]="STOP";
memset(Appbuffer, 0, sizeof(Appbuffer));
if (!TCPIP_TCP_IsConnected(appData.clientSocket))
{
SYS_CONSOLE_MESSAGE("\r\nConnection Closed\r\n");
appData.clientState = APP_TCPIP_WAITING_FOR_COMMAND;
break;
}
if (TCPIP_TCP_GetIsReady(appData.clientSocket))
{
TCPIP_TCP_ArrayGet(appData.clientSocket, (uint8_t*)Appbuffer, sizeof(Appbuffer) - 1);
SYS_CONSOLE_PRINT("%s", Appbuffer);
if(!strcmp(Appbuffer, ACK)) //// breakpoint
{
BSP_LEDStateSet(BSP_LED_1,BSP_LED_STATE_ON);
BSP_LEDStateSet(BSP_LED_2,BSP_LED_STATE_ON);
BSP_LEDStateSet(BSP_LED_3,BSP_LED_STATE_ON);
}
else if(!strcmp(Appbuffer, AOK)) // breakpoint
{
BSP_LEDStateSet(BSP_LED_1,BSP_LED_STATE_OFF);
appData.serverState = APP_TCPIP_CLOSING_CONNECTION;
SYS_CONSOLE_MESSAGE("Connection was closed\r\n");
}
}
}
由于调用了函数memset,AppBuffer的所有值都为null。 我在你发布的代码中没有看到AppBuffer被赋值。
因此AppBuffer本质上是一个零长度字符串,因此当您将其与AOK进行比较时,结果为false。请格式化您的代码。。另外,您可能希望使用
strncmp()
而不是strcmp()
来避免溢出问题AppBuffer
的内容是什么?这意味着什么:“Appbuffer[80]具有所有空变量,ACK[]=最后一个变量为空\0”@Haris输入来自TCP/IP,那么您到底是如何发现stdin溢出的风险的,而这在给定的代码中甚至不存在?根据Michael上面的评论,问题尚不清楚,我们无法重现该问题。如果Appbuffer只包含一个空终止符,那么它不会很好地从套接字接收到什么,是吗?strcmp调用并没有明显的问题,因为Appbuffer是预先用memset清除的。您的问题可能在套接字和通信部分的某个地方。是的,没错,在调试代码时,我收到了一条消息tcp rx buffer overflow,我从产品负责人那里收到了以下关于TCPIP_MAC_EV_rx_OVFLOW的文本。但我对他的回答并不满意。因为我正在向服务器套接字发送文本,所以只有当我尝试接收文本并进行比较以检查接收到的缓冲区的内容时,才会出现问题。如果确实收到了正确的消息,则执行一个函数,该函数将开始闪烁LED。行TCPIP\u TCP\u ArrayGet(appData.clientSocket,(uint8\u t*)Appbuffer,sizeof(Appbuffer)-1;
确实建议它应该接收数据并将其放入该缓冲区。是的,你是对的,此函数接收数据并将其放入Appbuffer,因此我们正在比较Appbuffer和预定义的缓冲区ACK[]=“START”和AOK[]=“STOP”。是的,我错了。我错过了。