【问题标题】:Sending Large files using TCP使用 TCP 发送大文件
【发布时间】:2017-03-24 20:58:40
【问题描述】:

我的客户端程序需要向服务器程序发送一个大文件。在客户端连接到服务器并且服务器接受它之后,客户端指定它将发送的文件的名称。现在,客户端需要使用 TCP 发送文件。

我知道,如果文件的大小很小(小于 1k 字节?),我可以在套接字编程中使用对“发送”函数的单个调用直接发送它。但是,如果我的文件很大,比如大约 100 MB,同样的工作吗?我想知道“发送”本身是否可以处理将大数据分成数据包并可靠发送的任务,还是应该由我来处理?

谢谢。

【问题讨论】:

  • 您没有指定语言、平台/操作系统或其他任何内容。
  • 您必须始终查看 send() 调用的返回值,以查看它实际从您的数组中读取了多少字节的数据并放入套接字的输出数据缓冲区。这对于“少量”数据和大量数据同样适用(但人们似乎侥幸逃脱的事实有时让他们相信并非如此)。根据 send() 返回的值,您需要确定下一步要做什么(例如,使用更新的参数再次调用 send() 以发送更多数据,或者出错,或者如果所有字节都已发送,则返回成功)
  • 它使用的是C,它的socket编程模块中有一个叫做send的函数。

标签: sockets tcp


【解决方案1】:

我正在尝试类似的东西,我的客户端代码如下所示

static void send_file(char *ipAddress, char *filename)
{
        struct sockaddr_in serverAddr;
        int skt;
        uint32_t addr_size;
        uint32_t sz;
        int32_t sent_bytes;
        FILE *fp;

        if ( inet_pton(AF_INET, ipAddress, &(serverAddr.sin_addr)) ){
                skt = socket(PF_INET, SOCK_STREAM, 0);
                serverAddr.sin_family = AF_INET;
        }
        else {
                inet_pton(AF_INET6, ipAddress, &(serverAddr.sin_addr));
                skt = socket(PF_INET6, SOCK_STREAM, 0);
                serverAddr.sin_family = AF_INET6;
        }

        serverAddr.sin_port = htons(7891);

        memset(serverAddr.sin_zero, '\0', sizeof(serverAddr.sin_zero));

        addr_size = sizeof(serverAddr);
        connect(skt, (struct sockaddr *) &serverAddr, addr_size);

        /*find file size*/
        fp = fopen(filename, "r");
        fseek(fp,0,SEEK_END);
        sz = ftell(fp);
        rewind(fp);

        sent_bytes = send(skt, fp, sz, 0);
        printf("sent %d bytes\n", sent_bytes);
        fclose(fp);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2016-02-17
    相关资源
    最近更新 更多