【问题标题】:C - Write File Contents to a BufferC - 将文件内容写入缓冲区
【发布时间】:2015-08-20 23:41:34
【问题描述】:

我正在尝试打开一个文件,然后将内容发送到 TCP 服务器。目前,我只是打开文件并将数据发送到缓冲区,服务器将访问该缓冲区。我不确定如何执行此操作以及如何跟踪单独文件中的所有位。我不是在寻找一个具体的答案,只要朝着正确的方向迈出一步就会有帮助!谢谢!

/* Open the input file to read */
FILE *fp;
fp = fopen(input_file, "r");

if (fp == NULL) {
    perror("Error opening the file");
    return(-1);
}

/* Send the contents of the input file to the server */ 
if (fgets(recvBuffer, buffer_size, fp)!=NULL) {

}

【问题讨论】:

  • 简单来说,您必须 connect() 到服务器(可能使用 inet_ntop() 将服务器的主机名和端口解析为 sockaddr_in),这将返回 int sd。然后 write() 缓冲区内容进入循环,直到文件结束。然后shutdown(),清空read()以确保服务器获取所有数据并close()。
  • 假设服务器也会在 eof 上关闭(SHUT_WR)(所有编写良好的服务器都会这样做)。

标签: c file sockets tcp client


【解决方案1】:

首先您需要在客户端和服务器之间建立网络基础设施(尝试查找有关如何在 C 中创建简单的客户端服务器应用程序的信息)。

然后您可以在客户端以二进制模式读取文件。然后您可以决定是要将整个文件发送到服务器,还是分块发送。

您需要考虑到诸如send/recv 之类的网络函数发送的字节数可能比您告诉他们的要少,因此您可能需要循环直到确保发送了所有字节。

首先,您可以参考here,它解决了我提到的所有要点。

【讨论】:

    【解决方案2】:

    使用您的代码的简单示例:

    /* Open the input file to read */
    FILE *fp;
    fp = fopen(input_file, "r");
    
    /*create address struct*/
    struct sockaddr_in dest;
    bzero(&dest,sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr=inet_addr(/*addr*/); //ex "127.0.0.1"
    dest.sin_port=htons(/*port*/); //ex 8888
    
    if (fp == NULL) {
        perror("Error opening the file");
        return(-1);
    }
    
    int sock_fp = socket(AF_INET, SOCK_STREAM, 0); /*create socket with TCP transfer protocol*/
    connect(sock_fp, (struct sockaddr *) &dest, sizeof(dest)); /*connect to server*/
    
    /* Send the contents of the input file to the server */ 
    while (fgets(recvBuffer, buffer_size, fp)!=NULL) {
        sendto(sock_fp, recvBuffer, strlen(recvBuffer), 0, (struct sockaddr *)&dest, sizeof(dest));
    }
    
    close(sock_fp);
    

    请注意,您需要在您提供的地址中使用一个服务器来侦听该端口。 另请注意,我将您的 if 更改为 while 循环,以防文件包含超过 1 行(fgets 逐行读取)
    最后,正如您所说,这包含最少的错误检查,如果socket 无法创建套接字或connect 失败,我将执行检查。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      相关资源
      最近更新 更多