[英]Receive file in C over network
我正在嘗試通過我的家庭網絡接收文件,但沒有取得多大成功。 我只能收到大約。 提供了此代碼的 10 個字符,但我無法取得太大進展。 我在服務器端的發送功能工作正常,我 99% 確定這段代碼中發生了一些我不理解的事情。 如果有人可以解釋我做錯了什么以及我應該做什么,那將不勝感激! 我知道應該添加正確的錯誤代碼和檢查,但只是為了保持一切整潔,我已經包含了繁重的代碼。
//********************** CLIENT CODE BELOW(RECEIVE FILE)**
#include "StartConnection.h"
#include <pthread.h>
#include <errno.h>
#define FILENAME "/Users/name/Desktop/holaS.txt"
#define LENGTH (512)
// port number where to port in application
#define PORT_NUMBER (2005)
int clientSocket;
char buffer[LENGTH];
struct sockaddr_in serverAddr;
socklen_t addr_size;
void setup(){
clientSocket = socket(PF_INET, SOCK_STREAM, 0); //socket create
serverAddr.sin_family = AF_INET; // settings
serverAddr.sin_port = htons(PORT_NUMBER); // port connection#
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");//ip localhost
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
// bind
addr_size = sizeof serverAddr;
connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);
/* FOR SENDING TEXT TO CONSOLE/REVEIVE
recv(clientSocket, buffer, 1024, 0);
Print the received message
printf("Data received: %s",buffer);
*/
rec_file(); // our entry
close(clientSocket);
}
char rec_file() {
recv(clientSocket, buffer, 512, 0);
int file_size = 0;
ssize_t len;
int remain_data = 0;
file_size = atoi(buffer); //512
FILE *file;
file = fopen(FILENAME,"ab+");
if(file == NULL){
printf("File Failed To Write");
}
remain_data = file_size;
//
while(((len = recv(clientSocket,buffer, buffer, 0)) >0) && (remain_data > 0)){
fwrite(buffer, sizeof(char), len,file);
}
return 0;
}
//*********** SERVER CODE (SEND FILEBELOW*******************************************
#define PORT_NUMBER (2005)
int welcomeSocket, newSocket;
char buffer[512];
struct sockaddr_in serverAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size;
void start_server(){
welcomeSocket = socket(PF_INET, SOCK_STREAM, 0); // create socket
serverAddr.sin_family = AF_INET; //type
serverAddr.sin_port = htons(PORT_NUMBER);
// localhost ip
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
// bind address
bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
// wait for connection max 5 connections
if(listen(welcomeSocket,5)==0)
printf("Listening\n");
else
printf("Error\n");
addr_size = sizeof serverStorage; // accept <=5
newSocket = accept(welcomeSocket, (struct sockaddr *&serverStorage, &addr_size);
printf("\n OK PRINT MESSAGE");
// char info[100];
// scanf("%s",&info);
// strcpy(buffer,info); // for writing text to client
// send(newSocket,buffer,13,0);
send_file(); // or entry function for our file send
close(welcomeSocket);
}
void send_file(){
/*
char file_name[100];
printf("Please Print Name of your File You Wish To Send");
scanf("%s",&file_name);
*/
FILE *f = fopen("/Users/name/Desktop/numbers.txt", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET); //same as rewind(f);
char *string = malloc(fsize + 1);
fread(string, fsize, 1, f);
printf("\n Sending File");
send(newSocket,string,13,0);
fclose(f);
printf("%s",string);
string[fsize] = 0;
free(string);
}
正如其他人已經指出的那樣,這段代碼存在一些明顯的問題,例如:
while(((len = recv(clientSocket,buffer, buffer, 0)) >0) && (remain_data > 0)){
fwrite(buffer, sizeof(char), len,file);
}
應該:
while(((len = recv(clientSocket,buffer, sizeof(buffer), 0)) >0) && (remain_data > 0)){
remain_data -= len;
fwrite(buffer, sizeof(char), len,file);
}
但是,整個客戶端/服務器代碼很笨拙。 您可能需要查看“Beej 的網絡編程指南”之類的內容,並從那里給出的示例之一開始。
這是很難得到正確的。 有很多閱讀手冊頁並參考了不同的代碼來嘗試使某些東西工作,不可否認,這是我第一次使用 C 套接字,我很高興我很掙扎,因為我在這個過程中了解了套接字和其他東西。 所以發生的事情是雙方都不正確。 使用“嘿,你好嗎”之類的簡單文本並發送 1 GB 文件是不同的,但在某種意義上是相同的。 需要使用具有正確邏輯的適當循環以及文件描述符,循環需要緩沖數據並讀入發送套接字,並且您可以想象在接收端也需要在緩沖區中讀取。 對我來說,真正贏得這場戰斗的是這個 PDF(抱歉,我丟失了鏈接,但有名字,輸入谷歌,你很可能會找到它)**“Mostafa Hassan Dahshan 博士計算機與信息科學學院沙特國王大學" *** 這給出了如何正確使用套接字的詳細示例,您可以剖析並查看發生了什么。 出於對社區的強烈熱愛,我不想發布我的代碼,但這本書將幫助您得出相同的結論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.