linux中socket编程实现将一端某文件内容传送到另一端某位置
时间: 2024-03-22 22:41:55 浏览: 13
在Linux中,可以使用socket编程实现将一端某文件内容传送到另一端某位置。具体实现步骤如下:
1. 在服务器端,创建一个socket,绑定IP地址和端口号,等待客户端连接。
2. 在客户端,创建一个socket,并连接到服务器端。
3. 服务器端接收客户端的连接请求,建立连接后,打开要传输的文件,将文件内容读入缓冲区,并将缓冲区内容发送到客户端。
4. 客户端接收服务器端发送来的数据,并将数据写入要保存的文件中。
5. 关闭连接和socket。
下面是一个简单的示例代码,可以实现将服务器端的文件内容传输到客户端:
服务器端代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#define PORT 8888
#define MAXLINE 1024
int main(int argc, char *argv[]) {
int sockfd, connfd, len;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 设置服务器地址和端口号
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
// 绑定地址
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 监听端口
listen(sockfd, 5);
printf("waiting for connection...\n");
// 接收连接请求
len = sizeof(cliaddr);
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
printf("connection established!\n");
// 打开要传输的文件
int fd = open(argv[1], O_RDONLY);
if (fd < 0) {
perror("open file error");
exit(1);
}
// 读取文件内容并发送到客户端
while ((len = read(fd, buff, sizeof(buff))) > 0) {
write(connfd, buff, len);
}
// 关闭文件和连接
close(fd);
close(connfd);
close(sockfd);
return 0;
}
```
客户端代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#define PORT 8888
#define MAXLINE 1024
int main(int argc, char *argv[]) {
int sockfd, len;
struct sockaddr_in servaddr;
char buff[MAXLINE];
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 设置服务器地址和端口号
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
// 连接服务器
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 打开要保存的文件
int fd = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (fd < 0) {
perror("open file error");
exit(1);
}
// 接收服务器发送的数据并写入文件
while ((len = read(sockfd, buff, sizeof(buff))) > 0) {
write(fd, buff, len);
}
// 关闭文件和连接
close(fd);
close(sockfd);
return 0;
}
```
运行时,需要在服务器端输入要传输的文件名作为命令行参数,客户端需要输入要保存的文件名作为命令行参数。例如:
```
// 服务器端
$ ./server file.txt
// 客户端
$ ./client 127.0.0.1 file_copy.txt
```