私はマルチスレッドのWebサーバーをプログラムしました。ここにはプログラムの1つの機能があります。この関数は、出力ファイル記述子(fd
)、コンテンツタイプ、提供するデータへのポインタ(*buf
)、およびデータのサイズ(numbytes
)を取ります。それは常に5775バイトで立ち往生する!私はsend()
の代わりにwrite()
を使ってみましたが、役に立たない!私は一度にbuf
全体を送ろうとしましたが、それをチャンクで転送しようとしましたが、wget
は5775バイトにぎこちないことを示しています!ここでは、コードは次のようになります。TCP接続でファイル全体を送信できません! (UNIX C)
int return_result(int fd, char *content_type, char *buf, int numbytes)
{
char out_buf[BUF_SIZE], numb[6];
int buf_len, total = 0, buf_size;
long int i = 0;
sprintf(numb, "%d", numbytes);
strcpy(out_buf, "HTTP/1.1 200 OK \nContent-Type: ");
strcat(out_buf, content_type);
strcat(out_buf, "\nContent-Length: ");
strcat(out_buf, numb);
strcat(out_buf, "\nConnection: Close\n \n");
printf("\nSending HTTP Header\n %d bytes sent!",
send(fd, out_buf, strlen(out_buf), 0));
char *start = NULL, *str = NULL, *temp = NULL;
start = buf;
printf("\n Start Pointer Val = %ld", &start);
while (start != NULL) {
printf("\n While Loop");
if (i + 2048 * sizeof(char) < numbytes) {
printf("\n If 1");
str = (char *)malloc(sizeof(char) * 2048);
memcpy(str, start, sizeof(char) * 2048);
i = i + 2048 * sizeof(char);
buf_size = send(fd, str, 2048, 0);
free(str);
printf("\n Sent %d bytes total : %d", buf_size, total =
total + buf_size);
temp = start + sizeof(char) * 2048;
start = temp;
} else {
i = numbytes - i * sizeof(char);
if (i > 0) {
printf("\n If 2");
printf("\n Value of i %d", i);
str = (char *)malloc(sizeof(char) * i);
memcpy(str, start, sizeof(char) * i);
printf("Total bytes finally sent:%d", total =
total + send(fd, str, i, 0));
if (total == numbytes) {
printf("\nTransfer Complete!");
}
free(str);
}
start = NULL;
}
}
printf("out of loop!");
return 0;
}
あなたが実際に得ている「最終的には送信された合計バイト数を:..」のメッセージを、あなたが期待するものに一致しますか?もしそうなら、それはバッファリング/フラッシュの問題かもしれません。 –
はい、実際にはサーバー側からすべてのバイトを送りますが、wgetは5775しか受け取りません! – Zombie