BSD C服务器未比较缓冲区中的字符串

BSD C服务器未比较缓冲区中的字符串,c,bsd,C,Bsd,所以我试图用strcmp将缓冲区与字符串进行比较。我希望服务器在客户端说“man”时以一种特殊的方式进行响应,否则就用got进行响应。我看不出我做错了什么,但我的输出总是“明白了”,而不是man,即使我从客户端输入man void dostuff (int sock) { int n; char buffer[256]; bzero(buffer,256); n = read(sock,buffer,255); //make list match each get

所以我试图用strcmp将缓冲区与字符串进行比较。我希望服务器在客户端说“man”时以一种特殊的方式进行响应,否则就用got进行响应。我看不出我做错了什么,但我的输出总是“明白了”,而不是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");*/
}
void dostuff(内部sock)
{
int n;
字符缓冲区[256];
b0(缓冲器,256);
n=读取(sock,缓冲区,255);
//使列表与每个get文本匹配并与用户匹配
如果(n<0)错误(“从套接字读取错误”);
如果(!strcmp(buffer,“man”))n=write(sock,“youaremanly”,18);
else{printf(“这是消息:%s\n”,缓冲区);
n=写(sock,“明白了”,18);};
//n=写(sock,“你是同性恋”,18);
if(n<0)错误(“写入套接字错误”);
/*
如果(n<0)错误(“从套接字读取错误”);
printf(“这是消息:%s\n”,缓冲区);
n=写(sock,“明白了”,18);
if(n<0)错误(“写入套接字错误”)*/
}

strcmp
假定以C为零结尾的字符串,您并不总是从套接字获取这些字符串(假定TCP是一个字节流,可以在向您返回数据时以任意方式分割该流)


检查接收到的块的大小(
n
在代码中)至少为
3
,然后使用带有显式大小参数的
memcmp

strcmp
假定以C为零结尾的字符串,而您并不总是从套接字获取这些字符串(假设TCP是一个字节流,可以在向您返回数据时以任意方式分割该流)


检查接收到的块的大小(
n
在代码中)至少为
3
,然后使用带有显式大小参数的
memcmp

问题是,您在客户端使用
fgets()
获取要发送到服务器的字符串。该字符串将有
\n
和结尾,并且与“man”不匹配

要删除缓冲区末尾的
\n
,可以执行以下操作:


strtok(buffer,“\n”);
将用
NULL
替换
\n
,这样您的
strcmp()
就可以工作了。

问题是,您在客户端使用
fgets()
获取要发送到服务器的字符串。字符串将有
\n
和结尾,并且与“man”不匹配

要删除缓冲区末尾的
\n
,可以执行以下操作:



strtok(buffer,“\n”);
\n
替换为
NULL
,因此您的
strcmp()

>将工作。

最后是C++还是C++?如果不是,请不要标记它。BSD问题不应该被标记为代码> Linux < /C>。这里没有C++。你试过在调试器中运行服务器还是看它通过PrTNF所说的内容?你能告诉我们客户端代码吗?很可能缓冲区包含“man”。如果你不想加上C++ C++的代码,就不要标记它C++。如果它不是,那么BSD问题不应该被标记为代码> Linux < /C>。这里没有C++。你试过在调试器中运行服务器还是看它通过PrTNF说什么?你能给我们看一下Cclin吗?t代码?很可能缓冲区包含“人”+垃圾吃点东西你想投票和/或接受对你帮助最大的答案。谢谢你,老兄,你知道流式传输图像或视频的方法吗?我不太明白如何使用比特流。你发送二进制数据的方式与发送文本数据的方式相同。只要确保打开文件读取二进制数据,将数据块读入缓冲区,发送到套接字上的缓冲区。查看open()、read()和write()。在流式传输数据时,您需要以一种不会对流的大小和/或终止进行假设的方式进行。始终确保发送部分告诉接收者它应该期望的值,反之亦然。如果是图像或视频,则您的文件将已经是二进制格式。正如Morten所说,我们发送时一定要告诉接收者er您正在发送的字节数。要让接收方知道要读取的字节数,您必须在数据包中包含要读取的字节数。这通常是通过预挂起数据包中的字节数来完成的。然后接收方可以读取此“标头”首先,现在数据包知道需要多少字节,然后读取数据包的其余部分。谢谢你,老兄,你知道流式传输图像或视频的方法吗?我不太明白如何使用比特流。你发送二进制数据的方式与发送文本数据的方式相同。只需确保打开文件读取二进制数据,将数据块读入缓冲区,然后发送查找open()、read()和write()中的。在流式传输数据时,您需要以一种不会对流的大小和/或终止进行假设的方式进行。始终确保发送部分告诉接收者它应该期望的值,反之亦然。如果是图像或视频,则您的文件将已经是二进制格式。正如Morten所说,我们发送时一定要告诉接收者er您正在发送的字节数。要让接收方知道要读取的字节数,您必须在数据包中包含要读取的字节数。这通常是通过预挂起数据包中的字节数来完成的。然后接收方可以读取此“标头”首先,然后读取数据包的其余部分,因为它知道需要多少字节。