Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C for Linux中的套接字发送文件_C_Linux_Sockets - Fatal编程技术网

使用C for Linux中的套接字发送文件

使用C for Linux中的套接字发送文件,c,linux,sockets,C,Linux,Sockets,我正在编写一个小而简单的服务器(在Linux工作站上使用C语言) 客户端向我的服务器请求一个文件,我的服务器向另一台服务器请求该文件,另一台服务器将其发送到我的服务器 我的服务器在将文件发送到客户端之前不应接收所有文件,但必须在文件到达时发送文件的字节 这是学校里的一个练习,所以我不能脱离这个要求 我已经实现了下面解释的功能。问题是,客户端接收到的字节数不确定,而不是整个文件 int Recv_and_send_file (int socketa, int socketb, char *buff

我正在编写一个小而简单的服务器(在Linux工作站上使用C语言)

客户端向我的服务器请求一个文件,我的服务器向另一台服务器请求该文件,另一台服务器将其发送到我的服务器

我的服务器在将文件发送到客户端之前不应接收所有文件,但必须在文件到达时发送文件的字节

这是学校里的一个练习,所以我不能脱离这个要求

我已经实现了下面解释的功能。问题是,客户端接收到的字节数不确定,而不是整个文件

int Recv_and_send_file (int socketa, int socketb, char *buffer, size_t file_size){

    size_t n;

    ssize_t nread;

    ssize_t nwritten;

    char c;

    for (n=1; n<file_size; n++)
    {        
            nread=recv(socketa, &c, 1, 0);

            if (nread == 1)
            {
                nwritten = send(socketb,&c,1,0);
            }
            else if (nread == 0)
            {
                *buffer = 0;
                return (-1); /* Errore */
            }
            else
                return (-1); /* Errore */
            }
    }
    *buffer = 0;
    return (n); 
}
int Recv_和int send_文件(int socketa、int socketb、char*buffer、size_t file_size){
尺寸;
ssize_t nread;
没有写的;
字符c;

for(n=1;n假设
file\u size
是您要发送的总字节数,那么
for
循环将只发送
file\u size-1
字节。换句话说,您将禁用一个。改为从
0
开始修复此问题:

    for (n=0; n<file_size; n++)
    { //..

for(n=0;n为了优化性能和简化代码,您可以使用splice()+管道。Sendfile使您能够在文件描述符之间“转发”数据,而无需复制到用户空间。

您确定复制了正确的代码吗?该部分不会编译,存在一个}在最后一个else中,它与对应的{

另外,您如何知道文件大小?如果它是以整数形式通过套接字发送的,请记住源计算机和目标计算机可能的字节顺序

无论如何,您每次读取一个字节,您应该通过以下方式进行改进:

编辑:使用缓冲区而不是额外的buff[2048]

int Recv_and_send_file (int socketa, int socketb, char *buffer, size_t file_size){

    ssize_t nread;
    ssize_t nwritten;
    ssize_t bLeft=file_size;

    while (bLeft > 0)
    {
        nread=recv(socketa, buffer, bleft, 0);
        if (nread > 0)
        {
            nwritten = send(socketb, buffer, nread, 0);
            bLeft -= nread;
            buffer+=nread;
        }
        else if (nread == 0)
        {
            // I think this could raise a memory exception, read below
            *buffer = 0;
            return (-1); /* Errore */
        }
        else
        {
            return (-1); /* Errore */
        }
    }
    // If buffer is allocated with file_size bytes this one will raise a memory exception
    // *buffer = 0;
    return (file_size-bLeft);
}

第二个服务器,在发送文件之前,将文件大小发送到我的服务器,以便在我的服务器上执行malloc并创建显示为函数输入的缓冲区。感谢您的回答我尽快尝试此代码!我不知道,缓冲区已经分配了足够的空间,因此代码会有所不同。不需要额外的buff[2048]。我将编辑响应以使其更好,并在缓冲区中保留文件内容。感谢您的回答,但我必须以显式方式发送每个字节的字节