gpt4 book ai didi

c - strcmp 在迭代服务器 C 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:46 24 4
gpt4 key购买 nike

我们正在使用 C 编写迭代服务器,它可以与 UNIX 上的 telnet 客户端一起使用。我们的代码工作正常,除了使用 strcmp() 执行字符串比较时。我们已按照本论坛中的建议尝试使用“\n”进行修复。下面的代码工作正常。我们甚至进入方法checkInput(in,out)

while(read(fileDescriptor,in,2000)>0)
{
in[strlen(in)-1]=0;
checkInput(in,out);
write(fileDescriptor,out,strlen(out));
}

当我们输入 checkInput(in,out) 时,我们希望将用户通过 telnet 输入的字符串与另一个预定义的字符串进行比较。但是我们总是以 else 语句结束,即使两个字符串完全相同。

void checkInput(char in[],char out[])
{
char tempString[]="GET TEMPERATURE\n";
char buzzer[]="GET BUZZER";

if(strcmp(in,tempString)==0)
{
strcpy(out,"Get Temp!");
//sprintf(out,"%d",temp);
}

else if(strcmp(in,"GET HUMIDITY")==0)
{
strcpy(out,"Get Hum!");
//sprintf(out,"%d",hum);
}

else if(strcmp(in,"GET LIGHT")==0)
{
strcpy(out,"Get Light!");
//sprintf(out,"%d",light);
}

else if(strcmp(in,"GET LED")==0)
{
strcpy(out,"Get LED!");
//sprintf(out,"%d",led);
}

else if(strcmp(in,"GET SOUND")==0)
{
strcpy(out,"Get Sound!");
//sprintf(out,"%d",sound);
}

else if(strncmp(in,buzzer, 11)==0)
{
strcpy(out,"Get Buzzer!");
//sprintf(out,"%d",buzzer);
}

else if(strcmp(in,"exit")==0)
{
strcpy(out,"Exiting... Get Out!");
exit(2);
}
else
{
strcpy(out,"\nDAAAAAMN YOU SERVER!!!!!!!!!\n");
sprintf(out,"%d",strcmp(in,buzzer));
}
}

任何帮助将不胜感激!谢谢!

最佳答案

让我们来做个小实验。

在一个 session 中,我们启动了一个 netcat(nc 进程),它监听连接并通过 hexdump(hd)转储它接收到的内容,以便我们可以看到telnet 实际发送的内容:

$ nc -l 8888|hd

在另一个 session 中,我们使用 telnet 发送一个小字符串:

$ telnet localhost 8888 <<<"Hello, world!"

现在,我们在第一个终端中看到了什么?

$ nc -l 8888|hd
00000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 <b>0d</b> 0a |Hello, world!..|
0000000f
$

Telnet 在每行的末尾发送 CRLF(假设该行最初以 LF 终止)。因此,当您在服务器端将接收到的输入拆分为多行时,您需要同时删除 \r\n。 (如果出于某种原因,原始行以 \r 而不是 \n 终止,那么您在另一端收到的通常是终止行通过 \r\0,尽管在​​这种情况下 telnet 也可以选择发送 \r\n

请注意,您不应假设单个 read 调用会返回整行,也不应假设它只会返回一行。单个 read 调用产生的数据量会受到如此多的环境变化的影响,因此不应做出任何假设。至少,您应该通过扫描 \r 然后删除 \r 和后面的 \n 来找到行尾> 或 \0。如果没有找到行终止符,则必须读取更多数据。如果行终止符后跟更多数据,则需要在后续步骤中对其进行处理,而不是(或之前)从套接字读取更多输入。

有关此主题的更多信息,请参阅 RFC-1123 “对 Internet 主机的要求”(在第 3 章中定义了 telnet 协议(protocol)),特别是第 3.3.1 节“Telnet 行尾约定”。

关于c - strcmp 在迭代服务器 C 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50259085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com