Sockets 使用TCP发送大文件

Sockets 使用TCP发送大文件,sockets,tcp,Sockets,Tcp,我的客户端程序需要向服务器程序发送一个大文件。在客户端连接到服务器并且服务器接受它之后,客户端指定它将发送的文件的名称。现在,客户端需要使用TCP发送文件 我知道如果文件的大小很小(小于1k字节?),我可以在socket编程中通过调用“send”函数直接发送。但是,如果我的文件大小很大,比如说大约100MB,是否也可以使用相同的方法?我想知道“发送”本身是否能够处理将大数据分成数据包并可靠地发送的任务,还是应该由我来处理 谢谢。我正在尝试类似的方法&我的客户端代码如下所示 static void

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

我知道如果文件的大小很小(小于1k字节?),我可以在socket编程中通过调用“send”函数直接发送。但是,如果我的文件大小很大,比如说大约100MB,是否也可以使用相同的方法?我想知道“发送”本身是否能够处理将大数据分成数据包并可靠地发送的任务,还是应该由我来处理


谢谢。

我正在尝试类似的方法&我的客户端代码如下所示

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);
}

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