我的目标是创建一个用C ++编写的app客户端服务器。 当服务器从客户端读取输入时,应处理字符串并给出输出。 基本上,我有一个简单的echo服务器发送相同的消息。 但是如果用户键入一个特殊字符串(如“退出”),程序必须执行其他操作。 我的问题是这个不会发生,因为字符串之间的比较不起作用...我不知道为什么! 这是一个简单的代码:
while(1) {
int num = recv(client,buffer,BUFSIZE,0);
if (num < 1) break;
send(client, ">> ", 3, 0);
send(client, buffer, num, 0);
char hello[6] ="hello";
if(strcmp(hello,buffer)==0) {
send(client, "hello dude! ", 12, 0);
}
buffer[num] = '\0';
if (buffer[num-1] == '\n')
buffer[num-1] = '\0';
std::cout << buffer;
strcpy(buffer, "");
}
为什么比较不起作用? 我尝试了很多解决方案......但都失败了:(
答案 0 :(得分:2)
buf
中的数据可能不会以NULL结尾,因为如果未初始化,buf
包含随机数据。您只知道第一个num
字节的内容。因此,在比较字符串之前,您还必须检查您收到了多少数据:
const char hello[6] ="hello";
size_t hello_sz = sizeof hello - 1;
if(num == hello_sz && memcmp(hello, buffer, hello_sz) == 0) { ...
作为旁注,除非你划分你的消息,否则这个协议将是脆弱的,所以如果读取碎片(第一次读取时收到“hel”,第二次读取“lo”),你可以知道一条消息的起始位置和另一个人结束了。
答案 1 :(得分:0)
strcmp需要以null结尾的字符串。您收到的缓冲区在收到消息后可能包含非空字符。
在阅读之前:
ZeroMemory(buffer, BUFSIZE); //or your compiler defined equivalent
或者在阅读之后
buffer[num] = '\0';
这将确保在收到的消息结尾处有一个终止空值,并且比较应该有效。
答案 2 :(得分:0)
string 被定义为char
s的数组,包括终止\0
字节。最初,您的buffer
包含任意字节,甚至不保证包含字符串。您必须设置buffer[num] = '\0'
才能使其成为字符串。
这当然意味着recv
不应该读取sizeof buffer
个字节,而是少一个字节。