Linux通过tcp远程连接客户端读取文件发送到服务端并返回到客户端c代码
时间: 2023-08-23 11:05:54 浏览: 91
以下是一个简单的示例程序,实现了客户端从本地读取文件,将其发送到远程服务器,然后服务器将文件内容返回给客户端。
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 9000
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s <server_ip> <filepath>\n", argv[0]);
exit(-1);
}
// 创建 socket
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
perror("socket");
exit(-1);
}
// 设置服务器地址
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0) {
perror("inet_pton");
exit(-1);
}
// 连接服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("connect");
exit(-1);
}
// 打开本地文件
FILE *fp = fopen(argv[2], "rb");
if (fp == NULL) {
perror("fopen");
exit(-1);
}
// 读取文件内容并发送到服务器
char buf[BUF_SIZE];
int len;
while ((len = fread(buf, 1, BUF_SIZE, fp)) > 0) {
if (send(sock, buf, len, 0) < 0) {
perror("send");
exit(-1);
}
}
// 关闭文件和 socket
fclose(fp);
close(sock);
return 0;
}
```
服务器代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 9000
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
// 创建 socket
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
perror("socket");
exit(-1);
}
// 绑定端口
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("bind");
exit(-1);
}
// 监听端口
if (listen(sock, 1) < 0) {
perror("listen");
exit(-1);
}
// 接受客户端连接
struct sockaddr_in cli_addr;
socklen_t cli_len = sizeof(cli_addr);
int conn_sock = accept(sock, (struct sockaddr *)&cli_addr, &cli_len);
if (conn_sock < 0) {
perror("accept");
exit(-1);
}
// 接收客户端发送的文件内容并写入到文件
FILE *fp = fopen("recv.txt", "wb");
if (fp == NULL) {
perror("fopen");
exit(-1);
}
char buf[BUF_SIZE];
int len;
while ((len = recv(conn_sock, buf, BUF_SIZE, 0)) > 0) {
fwrite(buf, 1, len, fp);
}
// 关闭文件和 socket
fclose(fp);
close(conn_sock);
close(sock);
return 0;
}
```
注意事项:
- 服务器端需要先绑定端口并监听,客户端需要连接服务器。
- 文件内容需要分批读取并发送,或者分批接收并写入。在本例中,我们使用了一个大小为 `BUF_SIZE` 的缓冲区进行分批读取和发送。
- 如果文件非常大,需要考虑分批读取并发送,或者使用其他方法进行传输,比如 HTTP 或 FTP 等协议。
阅读全文