C语言通讯传文件并结束
时间: 2024-04-30 19:23:49 浏览: 116
这个问题非常复杂,因为涉及到很多方面,包括文件读写、网络编程、进程间通信等。下面是一个简单的示例代码,可以实现在两台计算机之间传输文件,并在传输完成后结束:
发送方代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8888
#define BUFFER_SIZE 4096
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s <ip> <filename>\n", argv[0]);
return 1;
}
// 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
// 设置socket选项
int opt = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
perror("setsockopt");
return 1;
}
// 设置服务器地址
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, argv[1], &server_addr.sin_addr) <= 0) {
perror("inet_pton");
return 1;
}
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect");
return 1;
}
// 打开文件
FILE *fp = fopen(argv[2], "rb");
if (fp == NULL) {
perror("fopen");
return 1;
}
// 发送文件名
char filename[256];
strcpy(filename, argv[2]);
if (send(sockfd, filename, strlen(filename)+1, 0) < 0) {
perror("send");
return 1;
}
// 发送文件内容
char buffer[BUFFER_SIZE];
int nread;
while ((nread = fread(buffer, 1, BUFFER_SIZE, fp)) > 0) {
if (send(sockfd, buffer, nread, 0) < 0) {
perror("send");
return 1;
}
}
// 关闭文件和socket
fclose(fp);
close(sockfd);
return 0;
}
```
接收方代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8888
#define BUFFER_SIZE 4096
int main(int argc, char *argv[]) {
// 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
// 设置socket选项
int opt = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
perror("setsockopt");
return 1;
}
// 设置本地地址
struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(PORT);
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// 绑定socket到本地地址
if (bind(sockfd, (struct sockaddr *)&local_addr, sizeof(local_addr)) < 0) {
perror("bind");
return 1;
}
// 监听socket
if (listen(sockfd, 5) < 0) {
perror("listen");
return 1;
}
// 接受连接
int connfd = accept(sockfd, NULL, NULL);
if (connfd < 0) {
perror("accept");
return 1;
}
// 接收文件名
char filename[256];
int nread = recv(connfd, filename, sizeof(filename), 0);
if (nread < 0) {
perror("recv");
return 1;
}
// 打开文件
FILE *fp = fopen(filename, "wb");
if (fp == NULL) {
perror("fopen");
return 1;
}
// 接收文件内容
char buffer[BUFFER_SIZE];
while ((nread = recv(connfd, buffer, BUFFER_SIZE, 0)) > 0) {
fwrite(buffer, 1, nread, fp);
}
// 关闭文件和socket
fclose(fp);
close(connfd);
close(sockfd);
return 0;
}
```
这个示例代码还有很多不足之处,比如没有进行错误处理、没有处理文件传输中的中断等情况,只是为了演示基本的文件传输和网络编程流程。如果你需要更加完善的文件传输程序,建议使用现成的网络库或框架,比如libevent、boost.asio等。
阅读全文