【问题标题】:C TCP socket can't recieve fileC TCP套接字无法接收文件
【发布时间】:2018-07-22 08:16:27
【问题描述】:

我正在尝试在 C 中的套接字之间编写一个简单的文件传输。我的客户端代码如下所示:

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char **argv){
    int sockfd, n;
    struct sockaddr_in servaddr;

    sockfd=socket(AF_INET,SOCK_STREAM,0);

    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(22000);

    inet_pton(AF_INET, "127.0.0.1", &(servaddr.sin_addr));

    connect(sockfd,(struct sockaddr *)&servaddr, sizeof(servaddr));

    FILE* fp;
    fp = fopen("text.txt", "r");
    sendfile(sockfd, fp, NULL, 100);
}

我的服务器代码如下所示:

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    int listen_fd, comm_fd;

    struct sockaddr_in servaddr;

    listen_fd = socket(AF_INET, SOCK_STREAM, 0);

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

    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    listen(listen_fd, 10);

    comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);

    int bytes;
    char rec[100];

    FILE * fp;
    fp = fopen("random.txt", "w");

    while((bytes = read(comm_fd, rec, 100)) > 0){  
        fwrite(rec, 1, bytes, fp);
    }
}

如您所见,我正在从客户端向服务器发送text.txt 文件。然后在服务器上,我尝试读取它并将内容放在random.txt 中的while 循环中,但是当我执行它们时,客户端完成工作,服务器不会停止工作并且random.txt 中没有写入任何内容。 你能说出原因吗?

【问题讨论】:

  • 检查返回码。
  • 漂亮干净的错误检查和记录整个代码,免费提供调试。

标签: c file sockets networking tcp


【解决方案1】:

sendfile 需要一个文件描述符作为第二个参数,而不是 FILE *。如果您在代码中包含所有必要的头文件,您将在编译期间收到相应的错误消息。

要获得文件描述符,请使用open 打开文件,即替换行

FILE* fp;
fp = fopen("text.txt", "r");

int fp;
fp = open("text.txt", O_RDONLY);

另外,对于生产版本,不要忘记检查函数的错误返回值,如 openconnectbind,... 并在不再使用文件和套接字时关闭它们.

【讨论】:

  • 如何获取名为text.txt的文件的文件描述符
  • @GeorgeTsertsvadze 你可以使用fileno
  • 谢谢。我有更多关于套接字和文件的问题,但 StackOveflow 不允许我在 90 分钟内提出另一个问题。有没有一种聊天方式或类似的方式来问你这些问题?
  • @GeorgeTsertsvadze 友情提醒:SO 不是私人补习网站。提问者应自行进行合理的研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
相关资源
最近更新 更多