我正在进行一项练习,我需要在客户端和服务器之间建立网络并让它们“交谈”。我需要检查来自客户端的特定响应,然后让服务器采取相应措施。为了从客户端读取数据,我使用了一个在循环中调用 recv() 的函数,直到出现 '\n' 字符,或者没有更多字节要读取。当循环结束时,数组中的最后一个字符设置为 '\0'。函数完成后,我希望得到一个以空结尾的字符串,然后我可以在比较中使用它。这是功能 -
int read_in(int socket, char *buf, int len) {
char *s = buf;
int slen = len;
int c = recv(socket, s, slen, 0);
while((c>0) && (s[c-1]!='\n')) {
s+=c; slen-=c;
c = recv(socket, s, slen, 0);
}
if (c<0) {
return c;
} else if (c==0) {
buf[0] = '\0';
} else {
s[c-1] = '\0';
}
return len-slen;
}
现在,我等待连接,声明一个名为“buf”的数组来存储我使用上述函数读取的内容,然后将 2 个字符串与 strcmp() 进行比较
int connect_d = accept(listener_d, (struct sockaddr *)&client_addr, &address_size);
char buf[255];
read_in(connect_d, buf, sizeof(buf));
if (strcmp("Hello\0", buf) == 0) {
puts("Hello");
} else {
puts("Not Hello");
}
我相信“buf”字符串包含“Hello\0”,因此比较应该成功。但它不是。我不知道为什么。但是,如果我使用 strncmp() 比较 2 个字符串的前 5 个字节,则比较通过。但是当我比较前 6 个字节时,它失败了。我想知道在失败的第 6 个字节位置存储了什么。