我創建了一個FIFO,作爲家庭作業,一個大項目,模擬郵箱服務器編寫正確的方式/讀取數據超過
我不能發佈項目,因爲它很大(有很多文件),但我可以說有時我丟失了一些數據,或者它不能保持它的完整性。
我使用這些代碼段來傳輸數據,是不是有點錯Network_IO是我說的功能:
#include "Network.h"
int Network_Open(const char* path,int oflag)
{
return open(path,oflag);
}
ssize_t Network_IO(int fifo,NetworkOpCodes opcode,void* data,size_t dataSize)
{
ssize_t retsize = 0;
ssize_t tmpDataSize = (ssize_t)dataSize;
errno = 0;
if (tmpDataSize == 0) return 0;
while ((retsize = (opcode == NetworkOpCode_Write? write(fifo,data,tmpDataSize) : read(fifo,data,tmpDataSize))) != tmpDataSize)
{
if (errno != EINTR) break;
}
return retsize;
}
Boolean Network_Send(int fifo,const void* data,size_t dataSize)
{
return ((ssize_t)dataSize) == Network_IO(fifo,NetworkOpCode_Write,(void*)data,dataSize);
}
Boolean Network_Receive(int fifo,void* data,size_t dataSize)
{
return ((ssize_t)dataSize) == Network_IO(fifo,NetworkOpCode_Read,data,dataSize);
}
Boolean Network_Close(int fifo)
{
if (fifo >= 0)
return close(fifo) == 0;
}
編輯1:我使用的實際測試,其代碼段
Boolean Network_IO(int fifo,NetworkOpCodes opcode,void* data,size_t dataSize)
{
ssize_t retsize = 0;
ssize_t tmpDataSize = (ssize_t)dataSize;
ssize_t sentDataSize = 0;
errno = 0;
if (tmpDataSize == 0) return True;
while (sentDataSize < tmpDataSize)
{
switch(opcode)
{
case NetworkOpCode_Write:
retsize = write(fifo,data + sentDataSize,tmpDataSize - sentDataSize);
break;
case NetworkOpCode_Read:
retsize = read(fifo,data + sentDataSize,tmpDataSize - sentDataSize);
break;
}
if (retsize < 0)
{
if (errno != EINTR) return False;
else
{
errno = 0;
continue;
}
}
sentDataSize += retsize;
}
if (errno != 0)
return False;
return sentDataSize == tmpDataSize;
}
Boolean Network_Send(int fifo,const void* data,size_t dataSize)
{
return Network_IO(fifo,NetworkOpCode_Write,(void*)data,dataSize);
}
Boolean Network_Receive(int fifo,void* data,size_t dataSize)
{
return Network_IO(fifo,NetworkOpCode_Read,data,dataSize);
}
中看到代碼片段雖然我覺得你的回答很有趣,但我不需要討論我的設計決定。圍繞這一選擇有很多事情,我不會改變「包裝」寫入/讀取呼叫的決定。此外**阻止**實際上是由教師爲了學習目的而要求的。 –
那麼,案例是你的程序「幾乎是正確的」:看起來你可以編寫和調試一個計算機程序,但不知道要寫什麼。對你的設計選擇的文體評論並不打算作爲評論,而更多的是讓你意識到設計確實很重要。編程是微不足道的,設計程序不是。順便說一句:linux可掛載文件系統通過函數指針來實現你想要的抽象,或多或少的OO。 – wildplasser
設計背後的主要問題是它是一項家庭作業,有些東西應該像「老師說的」一樣完成,特別是循環方法,你可以在老師的筆記中找到它,所以我直接使用它,但是我認爲它不是完全正確,正如Mat所說,我認爲我必須發送數據的「重新部分」,我會試一試。我專注於設計,但是......好吧,我討厭C,並且在寫了很多天之後我生氣了。 –