【问题标题】:linux C server client streaming fileslinux C服务器客户端流文件
【发布时间】:2012-09-20 13:41:17
【问题描述】:

我正在尝试将文件从客户端流式传输到服务器,但是从 FILE 到 char 的数据类型不兼容,因此每次运行客户端时都会出现分段错误。我不知道如何解决这个问题。附件是服务器和客户端的代码,下面是客户端的问题。我正在尝试从客户端读取文件到缓冲区将其发送到服务器,服务器将从缓冲区读取文件并将其写入文件。 客户端http://pastebin.com/QtLbMgP3

服务器端http://pastebin.com/8PNchBUZ

// n = write(sock,"send me your message",18);
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
        ptr_myfile=fopen("test2.txt","w");

         for(counter=1;counter <=10;counter++){
             fwrite(&ptr_myfile,sizeof(*buffer),1,buffer);
             n = read(sockfd,buffer,255);
             n = write(sockfd,buffer,18);

             n = write(sockfd,buffer,strlen(buffer));
             if (n < 0) error("ERROR writing to socket");
             bzero(buffer,256);
             n = read(sockfd,buffer,255);
             if (n < 0) error("ERROR reading from socket");
             // printf("%s\n",buffer);
         };//close for loop
    close(sockfd);

    }// close event loop
    return 0;
}// close main function

【问题讨论】:

  • 请学会以正统的方式缩进你的代码。我修复了最糟糕的部分,但仍有很大的改进空间。此外,在标记为};//close for loop 的行中,分号是多余的;它在循环体之后立即创建一个空语句。不要忘记检查fopen() 是否有效;众所周知,文件不存在或没有正确的权限。

标签: c linux


【解决方案1】:

无需遍历所有代码,readwriteclose 系列 API(不是 fopenfread 等)具有整数描述符,而不是 FILE*

您不能将FILE*int 混合使用。

【讨论】:

  • 如何将文件写入缓冲区,然后将其发送到我的服务器
  • 好吧,至少答案正确地指出了 FILE * 与描述符的基本概念缺陷。如果有任何事情,这应该有助于编写正确的解决方案。虽然这不是一个完整的答案,但我不明白为什么这没有帮助
【解决方案2】:

在这里看这条线:

fwrite(&ptr_myfile,sizeof(*buffer),1,buffer);

它是如何编译的?

这可能是正确的:

fwrite(buffer, 1, sizeof(buffer), ptr_myfile );

以上行将从文件中读取最多 256 字节(缓冲区数组的大小)并将数据复制到缓冲区。请注意,我传递的是 ptr_myfile,而不是 &ptr_myfile。

【讨论】:

  • 谢谢,我没有编译错误,但是我如何将它保存到我的服务器端的文件中,尽管它应该保存它
  • @user1509326 即使它出于某种我们似乎无法选择的原因编译,在需要使用整数描述符的地方使用 FILE* 也是完全错误的。它绝对不会那样工作。请了解 FILE * 与描述符之间的区别,然后适当地使用。
  • @fayyazkl 我将 fwrite 更改为 selbie 的建议,这就是它编译的原因。
【解决方案3】:

检查您的 fwrite 语句,您是在尝试写入文件,还是从文件中读取到缓冲区?

如果是前一种情况,则使用 fwrite(buffer, sizeof(buffer),1, ptr_myfile) 即您要写入的流是最后一个变量。

如果是后者,那么您首先需要使用 fgets 或 getchar 或类似的函数从流中读取,然后才能将其实际放入缓冲区。

希望对你有帮助!


好的,在客户端读取文件并将其发送到服务器,

fp=fopen("<filename>", "r");
//This opens the file and initializes the pointer fp to the start of the file Start of
//the file, not its text necessarily

现在您可以使用 fgetc() 函数 [Character by character] 或 fgets() 函数 [如果文本被格式化,您可以将整行读入缓冲区] 将文件读入缓冲区。

fgets(buffer,sizeof(buffer),fp);
//This could be ambiguous as the second argument should correspond to
//pre-known limit of bytes to read here some Macro maybe.

现在,简单地使用 send() 将该缓冲区分派到服务器。

在服务器端,使用 recv() 从网络接收输入数据到某个“缓冲区”,然后使用 fputs 或 fprintf 或任何方便的函数写入以写入模式打开的文件。

【讨论】:

  • 服务器端会被 fopen 写入权限和 fread 提取到文件中正确吗?
  • 我正在尝试从客户端读取文件到缓冲区并将其发送到服务器,服务器将从缓冲区读取文件并将其写入文件。
  • 我在上面的评论中添加了一些解释,看看。
  • sne 原样还是我必须这样指定?发送(sockfd, "$C", 2, 0);
  • 参考手册页,是的,你必须按照上面评论中写的方式发送它。发送(sockfd,缓冲区,sizeof(缓冲区),);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多