gpt4 book ai didi

c++ - 为什么我的缓冲区在多次 read() 之后保存相同的数据?

转载 作者:行者123 更新时间:2023-11-28 06:40:38 25 4
gpt4 key购买 nike

我有一个使用命名管道的 C 语言客户端/服务器程序。我的服务器应该发送消息 "last line" 让客户端知道最后一行即将到来,因为那一行必须被特殊输出。我的客户读取“最后一行”,然后应该得到最后一行实际是什么,但在下一个 read() 之后,我的缓冲区仍然保留“最后一行”。

编辑 根据此处的要求,我的服务器和客户端代码发生了读/写操作。我的程序的总体目标是将文件名和搜索词发送到服务器,服务器逐行读取文件并返回在每一行中找到该词的频率。该信息随后由客户端打印。读取整个文件后,服​​务器将发送一个总计,客户端以特殊格式打印。服务器结束“server-EOF”表示它已完成通信。这是一项硬件作业,所以这些是我给出的规范。

服务器:

 ifstream rf(requestedFileName)

size_t found;
getline(rf,tempLine);//gets the first line of the file
while (!rf.eof())
{
currentLineNumber++;

found= tempLine.find(requestedTarget);//searches line for target
while(found != string::npos)//if it was found, increase counts and search again
{
totalTimesFoundInFile++;
totalTimesFoundOnLine++;
found=tempLine.find(requestedTarget, found+1);
}
if(totalTimesFoundOnLine != 0) //If it was found create the right string and send it to client
{
int n = sprintf(stringToSend, "Appeared on Line %d, %d times",currentLineNumber,
totalTimesFoundOnLine);
write(fd2, stringToSend, sizeof(stringToSend));
}

getline(rf,tempLine);//gets the next line
totalTimesFoundOnLine = 0; //resets the found count

}

//create the special total string.
int t = sprintf(stringToSend, "Appeared a Total of %d Times",totalTimesFoundInFile);
//Send a message to the client to let it know the special total line is coming
char finalLine[] = "final line";
if(write(fd2, finalLine, sizeof(finalLine)) != sizeof(finalLine))
{
cout<<"error writing" <<endl; }

cout <<"Just put 'finalLine' into pipe" <<endl;//lets me know the signal went out

int s= write(fd2,stringToSend, t);//writes the special total line into the pipe
if(s != t)
cout <<"error writing" <<endl;

cout <<"Just put last line into pipe" <<endl;//verifies that the special line got into the pipe and didn't block

char endingMessage[]="Server-EOF";//Let the client know the server is finished
write(fd2, endingMessage, sizeof(endingMessage));
cout <<"Wrote endingMessage" <<endl; //verifies the message got sent

客户:

char endMessage[] = "Server-EOF";
int nread;

nread = read(fd2, buffer, maxBufferSize);//reads the first input from the pipe
if(nread == -1) cout << "a read error occurred" <<endl;
else{
while(strcmp(buffer, endMessage) != 0) //check to 'server-EOF' message
{
cout << "Size of buffer is: " << strlen(buffer) <<endl;//verifies size of message recieved
if(strcmp(buffer, "final line") == 0)
{//Handler to recieve special total message and output it
nread =read(fd2, buffer, maxBufferSize);//get total message
if(nread == -1)
{
cout <<"a read error occurred" <<endl;
break;
}
else{
cout <<"Size of buffer is: " <<strlen(buffer) <<endl;//verify it got the total message
cout<< "Client : PID" << clientPID << " - Target >>"
<< requestedTarget <<"<< in File >>" << requestedFileName
<<"<< " << buffer << endl;
}
}
else{//Print out the information about search numbers for regular liens
cout <<"Client : PID " << clientPID << " - Target >>"
<<requestedTarget <<"<< " << buffer <<endl;
}
nread=read(fd2, buffer, maxBufferSize);//reads next message from pipe
if(nread == -1)
{
cout << "a read error occurred" << endl;
break;
}
}
}

输出:

Final string to send: Appeared a Total of 4 Times
Just put 'finalLine' into pipe
Just put last line into pipe
Wrote endingMessage
Size of buffer is: 27
Client : PID 5172 - Target >>apple<< Appeared on Line 1, 1 times
Size of buffer is: 27
Client : PID 5172 - Target >>apple<< Appeared on Line 2, 1 times
Size of buffer is: 27
Client : PID 5172 - Target >>apple<< Appeared on Line 4, 2 times
Size of buffer is: 10
Size of buffer is: 10
Client : PID6144 - Target >>apple<< in File >>pipedTest.txt<< final line
//This line ^^ should say something like" appeared a total of 11 times" instead of "final line"

我的客户端似乎收到消息“final line”(10 个字符),但是当它应该在之后读取总行时,它显然在缓冲区中仍然只有“final line”。我知道这一点,因为后来的输出只是一个无限循环,“最后一行”作为我的缓冲区。该循环必须意味着我所有进一步的 read() 调用都返回一个包含“final line”的缓冲区

最佳答案

管道是字节流。你无法改变这一点。您需要修复客户端才能正确找到消息的结尾。如果您有一个字节流但需要一个消息流,那么您需要实现一个消息层。

这是一些损坏的代码:

nread = read(fd2, buffer, maxBufferSize);//reads the first input from the pipe
if(nread == -1) cout << "a read error occurred" <<endl;
else{
while(strcmp(buffer, endMessage) != 0) //check to 'server-EOF' message

strcmp 函数仅适用于 C 风格的字符串,不适用于任意数据。 nread 变量保存您读取的数据的长度,但您处理数据时完全忽略了它。这不可能行得通。

关于c++ - 为什么我的缓冲区在多次 read() 之后保存相同的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26048160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com