Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过网络在C中接收文件_C_Linux_Sockets - Fatal编程技术网

通过网络在C中接收文件

通过网络在C中接收文件,c,linux,sockets,C,Linux,Sockets,我试图通过我的家庭网络接收文件,但没有成功。我只能收到大约10个字符与此代码提供,我无法取得很大进展。我在服务器端的send函数运行良好,我99%确信这段代码中有我不理解的地方。如果有人能善意地解释我做错了什么以及我应该做什么,我将不胜感激!我知道应该添加正确的错误代码和检查,但为了保持一切整洁,我已经包含了重载代码 //********************** CLIENT CODE BELOW(RECEIVE FILE)** #include "StartConnection.h" #

我试图通过我的家庭网络接收文件,但没有成功。我只能收到大约10个字符与此代码提供,我无法取得很大进展。我在服务器端的send函数运行良好,我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);
}
/*******************下面的客户端代码(接收文件)**
#包括“StartConnection.h”
#包括
#包括
#定义文件名“/Users/name/Desktop/holaS.txt”
#定义长度(512)
//要在应用程序中移植的端口号
#定义端口号(2005年)
int客户端套接字;
字符缓冲区[长度];
serverAddr中的结构sockaddr\u;
袜子尺寸;
无效设置(){
clientSocket=socket(PF_INET,SOCK_STREAM,0);//socket create
serverAddr.sin\u family=AF\u INET;//设置
serverAddr.sin\u port=htons(端口号);//端口连接#
serverAddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);//ip本地主机
memset(serverAddr.sin_zero,'\0',serverAddr.sin_zero的大小);
//束缚
地址大小=服务器的大小地址;
连接(clientSocket,(struct sockaddr*)和serverAddr,addr\u size);
/*用于向CONSOLE/Revive发送文本
recv(clientSocket,缓冲区,1024,0);
打印收到的消息
printf(“收到的数据:%s”,缓冲区);
*/
rec_file();//我们的条目
关闭(clientSocket);
}
char rec_文件(){
recv(clientSocket,缓冲区,512,0);
int file_size=0;
西泽特伦;
int=0;
文件大小=atoi(缓冲区);//512
文件*文件;
file=fopen(文件名为“ab+”);
if(file==NULL){
printf(“文件写入失败”);
}
保留数据=文件大小;
//
而(((len=recv(clientSocket,buffer,buffer,0))>0)和&(remain_data>0)){
fwrite(缓冲区、sizeof(char)、len、文件);
}
返回0;
}
//***********服务器代码(在下面发送文件)*******************************************
#定义端口号(2005年)
int welcomeSocket、newSocket;
字符缓冲区[512];
serverAddr中的结构sockaddr\u;
结构sockaddr_存储服务器存储;
袜子尺寸;
无效启动\u服务器(){
welcomeSocket=socket(PF_INET,SOCK_STREAM,0);//创建套接字
serverAddr.sin\u family=AF\u INET;//类型
serverAddr.sin\u port=htons(端口号);
//本地主机ip
serverAddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
memset(serverAddr.sin_zero,'\0',serverAddr.sin_zero的大小);
//绑定地址
绑定(welcomeSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
//等待连接最多5个连接
如果(监听(welcomeSocket,5)==0)
printf(“监听”);
其他的
printf(“错误\n”);

addr_size=sizeof serverStorage;//accept正如其他人已经指出的那样,此代码存在一些明显的问题,例如:

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 Dahsan博士计算机和信息科学学院
沙特国王大学“***这是一个详细的例子如何正确使用套接字,您可以仔细分析和查看发生了什么。我不想出于对社区的强烈热爱而发布我的代码,但这本书将帮助您得出相同的结论。

代码缺少
缓冲区
客户端套接字
的声明和初始化。另外,在
while
中使用buffer两次作为buffer一次来给出长度。如果buffer是一个数组,我想你需要
sizeof buffer
在那里。除了@KamiKaze;你确定服务器工作“很好”吗?你从服务器发送的第一件事是什么?是字符串“10”?您需要说明如何声明
buffer
。您使用它的方式似乎非常奇怪,而且很可能是错误的。尤其是第二个
recv
调用是奇怪的。在这里,您将
buffer
作为长度参数传递(即size\t)。也许您想通过512?顺便问一下:您是否尝试过简单打印
文件大小
?而且您没有检查第一个
recv
的返回值。如果是这样(提示!)此
remain\u data>0
一旦为真,它将永远为真。执行完整错误检查的代码是免费提供调试的代码。我已修改了您所指的循环。我仍然无法接收我的文件,但经过进一步调查;比较我的文件大小和发送到客户端的实际字节数,它不会相加,因此我我目前正在修复服务器端…感谢“Beej”的建议,事实证明它在强调逻辑方面非常有用。以下是链接:faculty.ksu.edu.sa/mdahshan/CEN463FA09/07-file_transfer_ex.pdf他似乎还有很多其他pdf,值得研究。