c语言实现tcp文件传输
时间: 2023-10-11 19:08:36 浏览: 204
要在C语言中实现TCP文件传输,可以使用套接字(socket)编程来实现。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define BUFFER_SIZE 1024
void error(const char *msg) {
perror(msg);
exit(1);
}
int main(int argc, char *argv[]) {
if (argc < 3) {
fprintf(stderr, "Usage: %s <server-ip> <filename>\n", argv[0]);
exit(1);
}
int sockfd, portno, n;
struct sockaddr_in serv_addr;
char buffer[BUFFER_SIZE];
portno = 12345; // 设置服务器的端口号
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
// 设置服务器地址
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
if (inet_pton(AF_INET, argv[1], &(serv_addr.sin_addr)) <= 0)
error("ERROR invalid server address");
// 连接到服务器
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR connecting");
// 打开要发送的文件
FILE *file = fopen(argv[2], "rb");
if (file == NULL)
error("ERROR opening file");
// 逐个读取文件内容并发送到服务器
while ((n = fread(buffer, sizeof(char), BUFFER_SIZE, file)) > 0) {
if (send(sockfd, buffer, n, 0) < 0)
error("ERROR sending file");
}
// 关闭文件和套接字
fclose(file);
close(sockfd);
printf("File transfer complete.\n");
return 0;
}
```
以上是客户端代码。你需要将 `<server-ip>` 替换为实际的服务器IP地址,`<filename>` 替换为要传输的文件名。服务器端的代码稍有不同,请见下方:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define BUFFER_SIZE 1024
void error(const char *msg) {
perror(msg);
exit(1);
}
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
exit(1);
}
int sockfd, newsockfd, portno, clilen, n;
struct sockaddr_in serv_addr, cli_addr;
char buffer[BUFFER_SIZE];
portno = 12345; // 设置服务器端口号
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
// 设置服务器地址
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
serv_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定套接字到服务器地址
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR on binding");
// 监听传入的连接请求
listen(sockfd, 5);
clilen = sizeof(cli_addr);
// 接受客户端连接
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
// 创建要接收的文件
FILE *file = fopen(argv[1], "wb");
if (file == NULL)
error("ERROR creating file");
// 逐个接收来自客户端的数据并写入文件
while ((n = recv(newsockfd, buffer, BUFFER_SIZE, 0)) > 0) {
if (fwrite(buffer, sizeof(char), n, file) < n)
error("ERROR writing to file");
}
// 关闭文件和套接字
fcl