通过网络接收C中的文件



我试图通过家庭网络接收一个文件,但没有成功。我只能收到大约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, '', 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, '', 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("Listeningn");
else
printf("Errorn");
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套接字,我很高兴我很挣扎,因为我在这个过程中了解了套接字和其他东西。因此,双方都不正确。使用"嘿,你好吗"这样的简单文本并发送1GB的文件是不同的,但在某种意义上是相同的。需要使用具有正确逻辑的正确循环以及文件描述符。循环需要缓冲数据并读取到发送套接字中,正如您可以想象的那样,在接收端也需要在缓冲区中读取。对我来说,真正赢得这场战斗的是这份PDF(很抱歉我丢失了链接,但有名字,在谷歌上键入,你很可能会找到它)**"Mostafa Hassan Dahshan计算机与信息科学学院博士沙特国王大学"***这提供了一个详细的例子,说明如何正确使用套接字,你可以仔细分析并了解发生了什么。我不想因为对社区的热爱而发布我的代码,但这本书将帮助你得出同样的结论。

最新更新