在 C 中使用套接字时的字符串比较

Posted

技术标签:

【中文标题】在 C 中使用套接字时的字符串比较【英文标题】:String comparison when using sockets in C 【发布时间】:2015-06-23 11:14:47 【问题描述】:

我似乎找不到解决方案,大多数人都有以下问题,但这对我不起作用。

int sock_fd;
int new_fd;
int rc;
char recv_client_msg[100];

rc=read(new_fd, recv_client_msg, sizeof(recv_client_msg));

if(rc>0)
 
   if(strcmp(recv_client_msg, "s1p1")==0) printf("s1p1\n"); 
   if(recv_client_msg[0]=="s") printf("m\n");
      

我的插座功能齐全。当客户端打开时,如果我按“m”键,程序会在本地终端上打印“m”。 但是,当我打开客户端时键入“s1p1”时,我想在本地终端上打印“s1p1”。 但是,尽管阅读了前面的示例并且编译成功,但这并没有发生。

任何提示将不胜感激

我的理论是它可能与处理第一个字符“s”的程序有关,但是当我输入“1”时,第一个“s”被“1”覆盖而不是占用第二个插槽在字符串中。

【问题讨论】:

添加一个printf( "rc = %d\n", rc ); 怎么样? 什么是'new_fd',如果未初始化可以吗? 添加 printf("'%.*s'\n", rc, recv_client_msg); 应该会告诉您出了什么问题。 确保您收到的字节数至少与您打算处理的一样多,如果您要比较字符串,最好确保它们是 NUL 终止的,就像 C 字符串一样。 大多数人没有这个。在 recv() 调用周围有一个循环,在字节进入时组装缓冲区并检查终止的 '\n'。 TCP 不传输字符串或消息,只是流中的字节。 【参考方案1】:

一些注意事项:

    要通过网络读取/发送数据,您需要this 和this 等函数。因为发送和接收并不总是发送/接收你告诉他们多少。

    您似乎使用了未初始化的变量new_fd,这看起来不太好。

    1234563终止。

【讨论】:

使用send()/recv()而不是write()/read()的原因是前者为标志带了一个额外的参数,将0作为标志传递使它们等同于后者. @iharob:你说如果我读写并指定说 100 个字节,他们确保发送/接收 100 个字节? 不,我没有这么说!你怎么能得出这样的结论?我刚刚说过send()/recv()write()/read() 并没有太大的不同,只是write()/read() 就像send()/rect() 的默认标志值为@987654338 @. @iharob:是的,但首先我可能不明白为什么这是相关的,因此评论 - 无论如何.. 这是因为从你回答的第一点开始就不清楚你为什么推荐send()/recv(),然后看起来你这样做是因为他们可以执行不完整的操作。【参考方案2】:

改用memcmp()strcmp()函数要求两个参数都被nul终止,当通过套接字传递字符串时不能保证,你可以使用memcmp(),它需要比较的字节数作为参数。

if (((rc == 4) || (rc == 5)) && (memcmp(recv_client_msg, "s1p1", rc) == 0))
    printf("s1p1\n");

执行(rc == 5) 测试是因为如果存在nul 终止字节,那么比较结果也应该为真。

【讨论】:

您选择 4 和 5 的任何特殊原因?并且 memcmp 不以某种方式限制为 8 吗?没关系 @DA93 是 4s1p1 中的字符数,5 用于包含终止 nul 字节,而 NO、@987654332 @ 完全没有限制,你为什么会这样认为? 不确定,我之前正在查看 memset,我看到了一些关于以某种方式受到限制但我不确定,这可能是其他地方的问题而不是解决方案,以及如何被 nul 终止在执行命令之前让它包含所有 4 个字符?如果我不使用它,我的上述理论是否正确? @DA93 memset() 与此答案没有任何关系,并且仅限于字节,因此除了所有 0s 之外,您不能 memset() 使用双精度指针,而我不明白你的新问题。 我已经用 memcmp 替换了我的 strcmp 命令,但没有任何反应:我运行程序成功连接到我的客户端,按 s 打印 s 但 memcmp 似乎没有任何区别。并用 memcmp 而不是 memset 替换我之前的问题,这是我的错误

以上是关于在 C 中使用套接字时的字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中比较两个 std::string 时的未定义行为 [关闭]

执行简单数据行比较器时的 C# 错误

“==” 与 equal()在比较String字符串时的差别

将字符串与Hangman项目中的char进行比较时的编译错误

C语言中字符串比较大小的规则!

比较 C 中链表中的值时的问题