【问题标题】:Creating a file transfer application using UDP in C在 C 中使用 UDP 创建文件传输应用程序
【发布时间】:2013-09-01 14:03:25
【问题描述】:

我正在尝试实现一个服务器-客户端应用程序,其中客户端将文件名发送到服务器。服务器查找文件,如果文件存在,它会将文件发送回客户端,然后继续。这是我编写的代码,但问题是服务器没有将文件内容发送回客户端我之前遇到了同样的问题,然后我重新编写了代码。

这里是代码:-

服务器端

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>

int main() {
    char buff[20];
    char content[200];
    int sd, connfd, len, bytes_read;

    struct sockaddr_in servaddr, cliaddr;

    sd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sd == -1) {
        puts("socket not created in server");
        return 1;
    } else {
        puts("socket created in server");
    }

    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;
    servaddr.sin_port = htons(7802);

    if (bind(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
        puts("Not binded");
        return 1;
    } else {
        puts("Binded");
    }

    len = sizeof(cliaddr);

    recvfrom(sd, buff, 1024, 0, (struct sockaddr *)&cliaddr, &len);

    printf("%s\n", buff);

    FILE *fp = fopen(buff, "r");
    if (fp == NULL) {
        printf("File does not exist \n");
        return 1;
    }

    while (1) {
        bytes_read = read(fp, content, sizeof(content));
        if (bytes_read == 0)
            break;
        sendto(sd, content, sizeof(content), 0, (struct sockaddr*)&cliaddr, len);
        bzero(content, 200);
    }
    strcpy(content, "end");
    sendto(sd, content, sizeof(content), 0, (struct sockaddr*)&cliaddr, len);

    return 0;
}

客户端:

#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <netinet/in.h>
#include <sys/types.h>

int main() {
    int count = 0;
    char buff[20], output[20];
    char file_buffer[200];
    int sockfd, connfd, len;

    struct sockaddr_in servaddr, cliaddr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd == -1) {
        puts("socket not created in client");
        return 1;
    } else {
        puts("socket created in  client");
    }

    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY; // ANY address or use specific address
    servaddr.sin_port = htons(7802);  // Port address

    puts("Type your UDP client message");
    scanf("%s", buff);
    puts("enter the name of new file to be saved");
    scanf("%s", output);

    // send msg to server
    sendto(sockfd, buff, strlen(buff) + 1, 0,
           (struct sockaddr *)&servaddr, sizeof(struct sockaddr));
    count++;
    printf("%d\n", count);

    FILE *fp = fopen(output, "a");
    if (fp == NULL) {
        puts("error in file handling");
        return 1;
    }
    recvfrom(sockfd, file_buffer, sizeof(file_buffer), 0, NULL, NULL);
    while (1) {
        if (strcmp(file_buffer, "end") == 0)
            break;
        printf("%s", file_buffer);
        write(fp, file_buffer, strlen(file_buffer));
        bzero(file_buffer, 200);
        recvfrom(sockfd, file_buffer, sizeof(file_buffer), 0, NULL, NULL);
    }

    puts("completed");
    return 0;
}

【问题讨论】:

  • 你能说出到底发生了什么吗?
  • 这就是代码应该如何工作 1. 客户端发送文件名(buff) 2. 服务器查找文件,如果文件存在,则打开它读取它并发送内容给客户。 3.client 询问要存储输出文件的文件名,并将内容从服务器写入文件。但是在编译代码并运行后会创建一个输出文件,但来自服务器的内容不会被写入其中。
  • 你修复了客户端吗?您还可以使用fopen()write() 而不是frwite()
  • 你有什么建议在客户端使用 fopen amd wite ?已经这样做了!
  • 不,fwrite() 而不是 write()

标签: c udp client-server


【解决方案1】:

您可能应该在服务器端使用fread() 函数而不是read()

函数fopen()read() 是不同接口的一部分:

家庭 read() -> 打开、关闭、读取、写入、ioctl(系统调用)

家庭 fread() -> fopen、fclose、fread、fwrite、fcntl(标准库)

我可以假设fopen() 给出的文件描述符与read() 期望的不完全相同。

在客户端也是如此。您使用fopen() 打开文件并使用write() 写入。请使用fwrite()

【讨论】:

  • 这意味着:在服务器代码中,您使用fopen() 打开文件,但您尝试使用read() 读取文件,将文件指针作为文件描述符传递,即不去工作。 (A) 注意您的编译器警告——如果您没有收到任何警告,请打开警告或获得更好的编译器。 (B) 对使用fopen(); use read()` 打开的文件流使用fread() 用于使用open()socket() 等创建的文件描述符。
  • 这里是服务器中代码的 sn-p while(1) { end=fread(content,strlen(content)+1,1,fp);如果(结束==0)中断; }
  • @UdayMittal:您的fread 电话似乎有误。你为什么在那里使用strlen()
  • 我已经把它修改为 sizeof(content) 这是一个错字~
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多