所以我试图将缓冲区与strcmp的字符串进行比较。我希望服务器以特殊的方式响应客户端说“man”的内容,否则只需回复即可。我看不出我做错了什么,但我的输出总是“得到它”而不是男人,即使我从客户输入 man 侧。
void dostuff (int sock)
{
int n;
char buffer[256];
bzero(buffer,256);
n = read(sock,buffer,255);
//make list match each get text and match to user
if (n < 0) error("ERROR reading from socket");
if (!strcmp ( buffer, "man" )) n = write(sock,"you are manly",18);
else{ printf("Here is the message: %s\n",buffer);
n = write(sock,"got it",18);};
//n = write(sock,"you are gay",18);
if (n < 0) error("ERROR writing to socket");
/*
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(sock,"got it",18);
if (n < 0) error("ERROR writing to socket");*/
}
答案 0 :(得分:3)
strcmp
假定C以零结尾的字符串,你并不总是从套接字获取(假设TCP,它是一个字节流,并且可以在向您返回数据时以任意方式拆分该流)。
检查收到的块的大小(代码中的n
)至少为3
,然后使用带有显式大小参数的memcmp
。
答案 1 :(得分:3)
问题是您在客户端中使用fgets()
来获取要发送到服务器的字符串。该字符串将具有\n
和结尾,并且与“man”不匹配。
要删除缓冲区末尾的\n
,您可以执行以下操作:
strtok (buffer, "\n");
会将\n
替换为NULL
,以便您的strcmp()
能够正常运作。