c - 客户端服务器套接字编程 - 发送文件

时间:2017-03-18 21:17:28

标签: c sockets client-server fwrite fread

在使用C语言的套接字时,我无法发送和接收文件。

假设我有一个2,463字节大的文件,我想将它从客户端发送到服务器,但它从不发送整个文件。

我一直在互联网上搜索一段时间,但找不到解决方案,所以如果有人能告诉我如何使这项工作,我会很高兴。

这是我的代码:

客户:

char buffer[256];

bzero(buffer, 256);

int block_size;

while(1){

block_size = fread(buffer, sizeof(char), sizeof(buffer), fs); // read from the file 

if (block_size == 0){

break;

}

if (block_size < 0){

perror("ERROR: Failed while sending data.");
exit(EXIT_FAILURE);

break;

}

void *p = buffer;

while (block_size > 0) {

int bytes_written = write(clientSocket, buffer, block_size); // send the data to server 

if (bytes_written <= 0) {

perror("ERROR: Failed while sending data.");
exit(EXIT_FAILURE);

}

block_size -= bytes_written;
p += bytes_written;

}

bzero(buffer, 256);

}

服务器

bzero(buffer, 256);

int file_block_size = 0;

while (1){

bzero(buffer, 256);

file_block_size = read(incoming_socket, buffer,255); // read the data from client

fwrite(buffer, sizeof(char), file_block_size, fr); // write the data to file

if (file_block_size == 0 || file_block_size < 256){

fwrite(buffer, sizeof(char), file_block_size, fr);

break;

}

}

正如我所说,这永远不会发送整个文件,例如2,463字节大,只有一部分。

在此先感谢,我将很高兴能得到任何帮助。

1 个答案:

答案 0 :(得分:1)

您需要将阅读与写入配对。与当前状态一样,您的客户端代码将仅发送上次读取操作的结果,因为您在每次读取时都会覆盖缓冲区的内容。

在客户端尝试这样的事情:

char buffer[256];
size_t bytes_read = 0;
ssize_t bytes_written = 0;
do{
    bytes_read = fread(buffer, sizeof(char), sizeof(buffer), fs);
    if(ferror(fs))
    {
        perror("Error while reading from file.");
        close(clientSocket);
        fclose(fs);
        exit(EXIT_FAILURE);
    }
    bytes_written = write(clientSocket, buffer, bytes_read);
    printf("Write operation status: %s; bytes sent: %d\n", strerror(errno), bytes_written);
} while(!feof(fs) && bytes_written != -1);

在服务器端,我会这样做:

char buffer[256];
ssize_t bytes_read = 0;
while((bytes_read = read(incoming_socket, buffer, sizeof(buffer))) > 0)
{
   printf("%d bytes read\n", bytes_read);
   fwrite(buffer, sizeof(char), bytes_read, fr);
   if(ferror(fr))
   {
       perror("Error while writing to file");
       close(incoming_socket);
       fclose(fr);
       exit(EXIT_FAILURE);
   }
}
if(bytes_read == -1)
    printf("%s\n", strerror(errno));