tcp实现简单的文件传输

用tcp实现文件传输,首先被请求的机器首先开启服务,等待文件传输请求,然后请求者打开客户端并且指定服务器地址和路径,服务器接受到请求把文件传输回来给客户端!
如:./tcp_copy_client 127.0.0.1 /home/jpou/test.cpp test.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//tcp_sc.h
#ifndef TCP_SC_H_
#define TCP_SC_H_
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
void server_init(int &listenfd,struct sockaddr_in &serveraddr,int port){
bzero(&serveraddr,sizeof(serveraddr));
listenfd = socket(AF_INET,SOCK_STREAM,0);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(listenfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
listen(listenfd,1000);
}
void client_init(int &connfd,struct sockaddr_in &serveraddr,char *src,int port){
bzero(&serveraddr,sizeof(serveraddr));
connfd = socket(AF_INET,SOCK_STREAM,0);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port);
inet_pton(AF_INET,src,&serveraddr.sin_addr);
connect(connfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
}
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//tcp_copy_server.cpp
#include"tcp_sc.h"
#include<stdio.h>
#include<unistd.h>
int main(){
int listenfd,connfd;
struct sockaddr_in serveraddr;
server_init(listenfd,serveraddr,12345);
while(true){
connfd = accept(listenfd,(struct sockaddr*)NULL,NULL);
int buf_size = 1000*1000;
unsigned char buf[buf_size];
char path[1000];
read(connfd,path,1000);
FILE * file = fopen(path,"r");
printf("%sn",path);
int n;
while((n = fread(buf,sizeof(unsigned char),buf_size,file)) > 0){
write(connfd,buf,n);
}
close(connfd);
fclose(file);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//tcp_copy_client.cpp
#include"tcp_sc.h"
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[]){
int port;
struct sockaddr_in serveraddr;
int connfd;
client_init(connfd,serveraddr,argv[1],12345);
FILE *file = fopen(argv[3],"w+");
int n;
int buf_size = 1000*1000;
char buf[buf_size];
printf("%sn",argv[2]);
write(connfd,argv[2],strlen(argv[2])+1);
while((n = read(connfd,buf,buf_size)) > 0){
fwrite(buf,sizeof(unsigned char),n,file);
}
fclose(file);
close(connfd);
}