在 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
,这看起来不太好。
【讨论】:
使用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 是4
是 s1p1
中的字符数,5
用于包含终止 nul
字节,而 NO、@987654332 @ 完全没有限制,你为什么会这样认为?
不确定,我之前正在查看 memset,我看到了一些关于以某种方式受到限制但我不确定,这可能是其他地方的问题而不是解决方案,以及如何被 nul 终止在执行命令之前让它包含所有 4 个字符?如果我不使用它,我的上述理论是否正确?
@DA93 memset()
与此答案没有任何关系,并且仅限于字节,因此除了所有 0
s 之外,您不能 memset()
使用双精度指针,而我不明白你的新问题。
我已经用 memcmp 替换了我的 strcmp 命令,但没有任何反应:我运行程序成功连接到我的客户端,按 s 打印 s 但 memcmp 似乎没有任何区别。并用 memcmp 而不是 memset 替换我之前的问题,这是我的错误以上是关于在 C 中使用套接字时的字符串比较的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中比较两个 std::string 时的未定义行为 [关闭]
“==” 与 equal()在比较String字符串时的差别