【问题标题】:Comparing string data received from a socket in C比较从 C 中的套接字接收的字符串数据
【发布时间】:2009-03-07 01:13:45
【问题描述】:

我有一个关于套接字的问题。我有这个代码:

while(bytes = recv(sClient, cClientMessage, 599, 0)){

这会将它接收到的消息放入 cClientMessage 中,并且消息始终是“消息”。我是如何做出像if(cClientMessage == "Message"){//do func} 这样的if 语句的。现在这段代码不会做我想要的功能。我认为这是因为它没有正确接收消息。有人可以帮我吗?

【问题讨论】:

  • 不知道为什么这被否决了..
  • 接受的解决方案中存在一些错误,并且原始问题中出现了一些未提及的错误。请在下面查看我的解决方案。 (例如:如果您收到“Message5”,即使知道它不应该是匹配的)。

标签: c++ c sockets


【解决方案1】:

试试:

if( strcmp( cClientMessage, "Message")) == 0 ) {
   // do something
}

根据 strager 的建议进行编辑:

一个更好的解决方案,不依赖于接收到的数据被空终止是使用memcmp:

if( memcmp( cClientMessage, "Message", strlen( "Message") )) == 0 ) {
   // do something
}

【讨论】:

  • 如果 \0 不存在,我想更多的 memcpy,但我想这可能有效。
  • memcmp,而不是我认为的 memcpy?
  • +1 清楚地阐述了所提出的问题。然而,Bondy 关于套接字使用的观点很重要。
  • memcmp 是不必要的。 “消息”以空值结尾,因此 strcmp 永远不会测试超过 8 个字符的数据。如果您知道 cClientMessage 保证长度超过 8 个字符,则不需要 memcmp。 (过早的优化,我知道。)
  • 我认为 strncmp 比 memcmp 更可取。此外,您没有检查消息是否短于 8 个字符 - 例如,如果您收到 4 个字节的“Mess”,并且您的缓冲区已经在其中包含“...age\0”,您可能会得到误报。
【解决方案2】:

首先你写的代码有一个bug:

while(bytes = recv(sClient, cClientMessage, 599, 0)){

这是错误的,因为如果存在套接字错误,recv 将返回非零,并且您的代码将导致无限循环。特别是您要检查 > 0

char cClientMessage[599];
while((bytes = recv(sClient, cClientMessage, sizeof(cClientMessage), 0)) > 0)
{
  if(strlen("Message") == bytes && !strncmp("Message", cClientMessage, bytes))
  {
    //cClientMesssage contains "Message"
  }
} 

if(bytes == 0)
{
  //socket was gracefully closed
}
else if(bytes < 0)
{
  //socket error occurred
}

您所做的问题:cClientMessage == "Message" 是,如果您将 char* 与字符串文字进行比较,或者将 char[] 与字符串文字进行比较,那么您将比较指针地址而不是实际内容。

【讨论】:

  • memset 很浪费。只需说 cClientMessage[bytes] = 0;根据 recv 的参数,字节的范围总是从 0 到 598。
  • 您应该使用 strncmp 而不是 strcmp。此外,您没有检查消息是否短于 8 个字符 - 例如,如果您收到 4 个字节的“Mess”,并且您的缓冲区已经在其中包含“...age\0”,您可能会得到误报。
  • 谢谢亚当,我也照顾好了
  • joe:使用 strcmp,您需要像我一样在整个缓冲区上使用 memset。我改为 strncmp 以完全避免 memset。
猜你喜欢
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2023-03-31
  • 1970-01-01
  • 2011-06-18
  • 2019-09-14
相关资源
最近更新 更多