BSD C服务器未比较缓冲区中的字符串
所以我试图用strcmp将缓冲区与字符串进行比较。我希望服务器在客户端说“man”时以一种特殊的方式进行响应,否则就用got进行响应。我看不出我做错了什么,但我的输出总是“明白了”,而不是man,即使我从客户端输入manBSD 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
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您正在发送的字节数。要让接收方知道要读取的字节数,您必须在数据包中包含要读取的字节数。这通常是通过预挂起数据包中的字节数来完成的。然后接收方可以读取此“标头”首先,然后读取数据包的其余部分,因为它知道需要多少字节。