所以我需要從服務器到客戶端的recv一個HTML文件,該文件是比緩衝區更大,所以我讓幾個發送。這就是爲什麼我有這樣的循環,當我的recv如何recv直到theres沒有更多的recv沒有eof?
while (i = recv(s, buf, TAM_BUFFER, 0)) {
if (i == -1) {
perror(argv[0]);
fprintf(stderr, "%s: error reading result\n", argv[0]);
exit(1);
}
while (i < TAM_BUFFER) {
j = recv(s, &buf[i], TAM_BUFFER - i, 0);
if (j == -1) {
perror(argv[0]);
fprintf(stderr, "%s: error reading result\n", argv[0]);
exit(1);
}
i += j;
}
/* Print out the file line by line. */
printf("%s", buf);
}
發送看起來是這樣的:
while (fgets(buf, sizeof(buf), fp)){
if (send(s, buf, TAM_BUFFER, 0) != TAM_BUFFER) errout(hostname);
}
的問題是循環永遠不會結束,becase的它不RECV的EOF,我從來都不是0,它只是在那裏阻止。 我不能做接近發送的eof,因爲他recv整個文件後,客戶端會要求另一個文件。
我tryed如果循環受阻停留時間超過5秒,但它不按預期方式工作,因爲循環不會停止發送SIGALRM,它會拋出一個錯誤。我知道我需要改變內部循環,但然後生病都有同樣的問題(012) ,j永遠不會是0,所以我不知道我該如何結束它(或者我不需要第二個循環)。
編輯:我不能發送文件的lenght beucause協議IM以下
您需要發送提前文件的文件的長度,且僅接收文件時讀取插座正是許多字節。 – EJP
我忘了補充一點,我已經在stackoverflow中搜索,我發現該選項,但協議im下面不讓我使用該選項。我只需要發送客戶要求的內容,而且我無法發送長度。 –
如果它不支持你想要做的事情,你將不得不改變你所關注的協議。 – EJP