我正在爲我的網絡類編寫一個簡單的服務器,並且我無法正確地將數據傳輸到客戶端(由教授提供)。服務器寫入套接字但數據未到達客戶端
一旦我完成了所有設置並建立了連接,我就開始讀取文件的塊並將它們寫入套接字,檢查讀取和寫入函數的返回是否匹配。我還保持讀取/寫入的字節總數,並將其與總文件大小(通過stat.st_size
)進行比較,它們全部匹配。
無論我多少次請求同一個文件,服務器端的日誌總是有正確的度量標準。客戶偶爾會丟失文件的結尾。實際尺寸與預期尺寸之間的差異從一次調用到下一次調整幾乎是不變的,而且它總是缺少文件的末尾,沒有中間的片斷。到達文件的大小也是512的倍數(塊大小)。
所以,似乎整個區塊的一些數目正在它,然後其餘的都迷路somehow.:w
#define CHUNK_SIZE 512
/* other definitions */
int main()
{
/* basic server setup: socket(), bind(), listen() ...
variable declarations and other setup */
while(1)
{
int cliSock = accept(srvSock, NULL, NULL);
if(cliSock < 0)
; /* handle error */
read(cliSock, filename, FILE_NAME_SIZE - 1);
int reqFile = open(filename, O_RDONLY);
if(reqFile == -1)
; /* handle error */
struct stat fileStat;
fstat(reqFile, &fileStat);
int fileSize = fileStat.st_size;
int bytesRead, totalBytesRead = 0;
char chunk[CHUNK_SIZE];
while((bytesRead = read(reqFile, chunk, CHUNK_SIZE)) > 0)
{
totalBytesRead += byteasRead;
if(write(cliSock, chunk, bytesRead) != bytesRead)
{
/* perror(...) */
/* print an error to the log file */
bytesRead = -1;
break;
}
}
if (bytesRead == -1)
{
/* perror(...) */
/* print an error to the log file */
close(cliSock);
continue;
}
/* more code to write transfer metrics etc to the log file */
}
}
所有拆下的錯誤處理代碼的是打印錯誤消息的一些味道到日誌文件並回到循環的頂部。
編輯擲<
本來應該>
如果然後返回0,我們到達了文件的末尾while循環退出('而(0)')和if語句跳過我們在錯誤代碼,我們進入到打印傳輸指標 – Matt
你的困惑可能是由於我錯誤輸入該行上的條件運算符而造成的。老實說,另一種方式根本沒有意義。 – Matt