c 发送和接收文件

c++

1个回答

写回答

了乐

2025-07-04 01:50

+ 关注

互联网
互联网

使用C语言可以实现文件的发送和接收功能。通过网络传输文件是现代通信中非常常见的操作,无论是局域网内还是互联网上,都可以使用C语言实现文件的传输。下面将介绍文件发送和接收的基本原理,并给出相应的案例代码。

文件发送原理

文件发送的基本原理是将文件拆分成小块,然后通过网络逐个发送这些小块,接收方再将这些小块组合成完整的文件。在C语言中,可以使用套接字(socket)来实现文件的发送。

首先,需要创建一个套接字用于发送文件。可以使用socket函数创建一个套接字,并指定传输协议(如TCP或UDP)和端口号。然后,使用bind函数将套接字与本地IP地址和端口号绑定。

接下来,需要连接接收方的套接字。使用connect函数将发送方的套接字连接到接收方的IP地址和端口号。这样,发送方就可以将文件数据发送给接收方。

在发送文件之前,需要打开待发送的文件,并按照指定的大小拆分成小块。可以使用fopen函数打开文件,然后使用fread函数读取文件数据,并使用send函数将数据发送给接收方。

发送完毕后,关闭文件和套接字,释放资源。

下面是一个简单的文件发送的C语言代码示例:

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define BUF_SIZE 1024

int mAIn(int argc, char *argv[]) {

int sock;

char filename[100];

char buf[BUF_SIZE];

FILE *fp;

int len;

struct sockaddr_in serv_addr;

if (argc != 3) {

printf("Usage: %s <IP> <port>\n", argv[0]);

exit(1);

}

sock = socket(PF_INET, SOCK_STREAM, 0);

if (sock == -1) {

perror("socket() error");

exit(1);

}

memset(&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

serv_addr.sin_port = htons(atoi(argv[2]));

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {

perror("connect() error");

exit(1);

}

printf("Input file name to send: ");

scanf("%s", filename);

fp = fopen(filename, "rb");

if (fp == NULL) {

perror("fopen() error");

exit(1);

}

while ((len = fread(buf, 1, BUF_SIZE, fp)) > 0) {

if (send(sock, buf, len, 0) == -1) {

perror("send() error");

exit(1);

}

}

fclose(fp);

close(sock);

return 0;

}

文件接收原理

文件接收的基本原理是通过套接字接收发送方发送的文件数据,并将这些数据写入本地文件中。同样地,在C语言中,可以使用套接字来实现文件的接收。

首先,需要创建一个套接字用于接收文件。可以使用socket函数创建一个套接字,并指定传输协议(如TCP或UDP)和端口号。然后,使用bind函数将套接字与本地IP地址和端口号绑定。

接下来,等待发送方连接。使用listen函数监听指定的端口,并使用accept函数接受发送方的连接请求。这样,接收方就可以接收发送方发送的文件数据。

在接收文件数据时,使用recv函数从套接字中接收数据,并使用fwrite函数将数据写入本地文件。可以通过循环接收,直到接收完所有的文件数据。

接收完毕后,关闭文件和套接字,释放资源。

下面是一个简单的文件接收的C语言代码示例:

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#define BUF_SIZE 1024

int mAIn(int argc, char *argv[]) {

int serv_sock, clnt_sock;

char filename[100];

char buf[BUF_SIZE];

FILE *fp;

int len;

struct sockaddr_in serv_addr, clnt_addr;

socklen_t clnt_addr_size;

if (argc != 2) {

printf("Usage: %s <port>\n", argv[0]);

exit(1);

}

serv_sock = socket(PF_INET, SOCK_STREAM, 0);

if (serv_sock == -1) {

perror("socket() error");

exit(1);

}

memset(&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

serv_addr.sin_port = htons(atoi(argv[1]));

if (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {

perror("bind() error");

exit(1);

}

if (listen(serv_sock, 5) == -1) {

perror("listen() error");

exit(1);

}

clnt_addr_size = sizeof(clnt_addr);

clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);

if (clnt_sock == -1) {

perror("accept() error");

exit(1);

}

printf("Input file name to save: ");

scanf("%s", filename);

fp = fopen(filename, "wb");

if (fp == NULL) {

perror("fopen() error");

exit(1);

}

while ((len = recv(clnt_sock, buf, BUF_SIZE, 0)) > 0) {

if (fwrite(buf, 1, len, fp) != len) {

perror("fwrite() error");

exit(1);

}

}

fclose(fp);

close(clnt_sock);

close(serv_sock);

return 0;

}

通过以上的代码示例,可以实现简单的文件发送和接收功能。在实际应用中,还需要考虑文件的完整性校验、断点续传等功能,以提高文件传输的可靠性和效率。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号