[英]Multiple writes in server socket to single read in client socket program?
我已經看到了許多與我想做的事情有關的問題,但到目前為止,我還沒有找到任何適合我的解決方案。
我嘗試編寫兩個套接字程序(一個客戶端和一台服務器),以便服務器能夠將任何類型的文件(按字節)發送到客戶端。 我不確定如何構造/協調以下內容:
(在服務器中)讀取語句以從文件中獲取數據(我正在使用fread())
(在服務器中)將數據發送到客戶端的寫語句(我正在使用write())
(在客戶端中)讀取語句以從服務器接收數據(我正在使用read())
(在客戶端中)寫語句,用於將從服務器接收的數據寫到文件中(我正在使用fwrite())
我想以字節為單位傳輸數據。 無論文件有多大,服務器中的一條fread()語句和一條write()語句是否足夠? (或者這取決於我緩沖區的大小嗎?)在客戶端,一次調用read()和一次調用fwrite()是否足夠? (或者這取決於我的緩沖區的大小嗎?)
我是套接字編程的新手。 提前致謝! 我的服務器和客戶端的以下部分:
客戶端:
/*try to get file from server*/
char receive_buffer[256];
FILE * new_file;
int bytes_received = 0;
new_file = fopen("newfile.txt", "w");
bytes_received = read(conn_s, receive_buffer, 256);
printf("Received %d bytes\n", bytes_received);
while( bytes_received > 0)
{
bytes_received = read(conn_s, receive_buffer, 256);
printf("Received %d bytes\n", bytes_received);
fwrite(receive_buffer, 1, bytes_received, new_file);
printf("writing bytes!\n");
break;
}
if(bytes_received < 0)
{
printf("/nError reading bytes of data/n");
}
服務器代碼部分:
FILE * file_to_get = fopen("sample.txt", "rb");
if(file_to_get == NULL)
{
printf("No such file!");
exit(0);
}
while(1)
{
unsigned char buff[256];
int num_read = fread(buff, 1, 256, file_to_get);
printf("read %d bytes\n", num_read);
if(num_read > 0)
{
write(conn_s, buff, num_read);
printf("writing %d bytes\n", num_read);
}
if(num_read < 256)
{
if(feof(file_to_get))
printf("End of file\n");
if(ferror(file_to_get))
printf("Error reading bytes\n");
break;
}
}
發送到網絡時,可以使用單個調用write()
。 如果內核中沒有足夠的緩沖區空間來處理整個事務,則write()
將阻塞,直到能夠處理所有緩沖區。 您也可以分塊編寫它,也可以。 沒關系。
從網絡讀取時,必須循環調用read()
。 您在調用read()
時指定的緩沖區大小只是允許返回的最大值,它不會等待收到那么多的緩沖區。 因此它可以(並且經常這樣做)返回的收益少於此收益。 只需繼續調用read()
直到返回0
表示EOF,然后將每個緩沖區寫入文件即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.