Linux Socket Put与Get实现
使用socket编程实现一个简单的文件服务器。客户端程序实现put功能(将一个文件从本地传到文件服务器)和get功能(从文件服务器取一远程文件存为本地文件)。客户端和文件服务器不在同一台机器上。
View Code
1 //sever端
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <arpa/inet.h> //AF_INET使用
8 #include <netinet/in.h>
9 #include <netdb.h>
10 #include <string.h>
11 #define MAXSIZE 100
12 #define PORT 5000
13 #define BLOCK 5
14 void main(int argc,char *argv[])
15 {
16 int server_sockfd,client_sockfd;
17 int server_len,client_len;
18 struct sockaddr_in server_add;
19 struct sockaddr_in client_add;
20 int read_cnt;
21 char tmp[4]; //控制字
22 char file_name[MAXSIZE]; //文件名
23 char send[MAXSIZE]; //发送文件
24 char recv[MAXSIZE]; //接收文件
25 int opt =1;
26
27 memset(file_name,'\0',MAXSIZE);
28 //step1:建立套接字
29 if(-1==(server_sockfd=socket(AF_INET,SOCK_STREAM,0)))
30 {
31 perror("socket Err");
32 exit(EXIT_FAILURE);
33 }
34 //step2:实名绑定
35 bzero(&server_add,sizeof(struct sockaddr_in));
36 server_add.sin_family = AF_INET;
37 server_add.sin_addr.s_addr =htonl(INADDR_ANY);
38 server_add.sin_port = htons(PORT);
39 server_len = sizeof(server_add);
40 setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); //避免垃圾socket
41 if(bind(server_sockfd,(struct sockaddr *)&server_add,server_len)<0)
42 {
43 perror("bind Err");
44 exit(EXIT_FAILURE);
45 }
46 //Step3:建立listen队列
47 if(listen(server_sockfd,BLOCK)<0)
48 {
49 perror("listen Err");
50 exit(EXIT_FAILURE);
51 }
52 //step4:获取accpet+具体相应过程
53 while(1)
54 {
55 client_len = sizeof(client_add);
56 client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_add,&client_len);
57 if(-1 == client_sockfd)
58 {
59 perror("Accept Err");
60 exit(EXIT_FAILURE);
61 }
62 printf("now Build the accept!\n");
63 //对具体控制字相应
64 read(client_sockfd,tmp,4);
65 // read(client_sockfd,file_name,MAXSIZE);
66 read(client_sockfd,file_name,MAXSIZE);
67 printf("Cnt_Flag:%s,file_name:%s\n",tmp,file_name);
68 //FILE *fd=fopen(file_name,"rb");
69 FILE *fd=fopen(file_name,"a+b");
70 if(fd == NULL)
71 {
72 perror("Get Fopen Err");
73 exit(EXIT_FAILURE);
74 }
75 if(0==strcmp(tmp,"get"))
76 {
77 printf("Client get file from local server!\n");
78 while(!feof(fd))
79 {
80 int len=fread(send,1,MAXSIZE,fd); //在文件中读取字符串到缓冲区
81 write(client_sockfd,send,len); //从缓冲区向client_sockfd写入信息
82 printf("->");
83 }
84 printf("Send Success!\n");
85 }
86 else
87 {
88 printf("client send file to local server!\n");
89 while(1)
90 {
91 read_cnt = read(client_sockfd,recv,MAXSIZE); //套接字向缓冲区写入
92
93 if(0==read_cnt)
94 {
95 break;
96 }
97
98 fwrite(recv,1,read_cnt,fd); //向文件写入缓冲区内容
99 printf("->");
100 }
101 printf("receive success!\n");
102 }
103
104 close(client_sockfd);
105 fclose(fd);
106 }
107
108 exit(EXIT_SUCCESS);
109 }
View Code
1 //client.c
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <arpa/inet.h> //AF_INET使用
8 #include <netinet/in.h>
9 #include <netdb.h>
10 #include <string.h>
11 #define MAXSIZE 100
12 #define GET 0
13 #define PUT 1
14 int main(int argc,char *argv[]) //0:应用程序 1:get/put 2:主机 3:port 4:远端文件名 5:本地文件名
15 {
16 int sockfd,len;
17 char recvs[MAXSIZE];
18 char send[MAXSIZE];
19 struct sockaddr_in add;
20 struct hostent *host;
21 int read_cnt=0;
22 char *get_ch = "get";
23 char *put_ch = "put";
24 if(argc != 6)
25 {
26 printf("client ip port filename\n");
27 printf("Tips:0:应用程序 1:get/put 2:主机 3:port 4:远端文件名 5:本地文件名\n");
28 exit(EXIT_FAILURE);
29 }
30 host = gethostbyname(argv[2]); //serve地址转换
31 if(-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
32 {
33 perror("socked Err!");
34 exit(EXIT_FAILURE);
35 }
36 bzero(&add,sizeof(add)); //sock实名
37 add.sin_family = AF_INET;
38 add.sin_addr = *((struct in_addr *)host->h_addr);
39 add.sin_port = htons(atoi(argv[3]));
40 len = sizeof(add);
41 if(-1==connect(sockfd,(struct sockaddr *)&add,len))
42 {
43 perror("connect Err!");
44 exit(EXIT_FAILURE);
45 }
46 FILE *fd = fopen(argv[5],"a+b"); //create an empty file binary::本地文件存储
47 if(fd == NULL)
48 {
49 perror("file create failure!");
50 exit(EXIT_FAILURE);
51 }
52 if(strcmp(argv[1],"get")==0) //相等
53 {
54 //获取文件
55 printf("\n Get the File:%s From Ip:%s:%s,Copy the local file:%s\n",argv[4],argv[2],argv[3],argv[5]);
56
57 //写入控制信息
58 write(sockfd,get_ch,sizeof(get_ch)); //下载命令
59 // write(sockfd,argv[4],MAXSIZE); //下载文件名
60 write(sockfd,argv[4],strlen(argv[4])); //下载文件名
61
62 printf("file len:%d\n",strlen(argv[4]));
63 //接收文件
64 printf("\nNow:reve the file\n");
65 while(1)
66 {
67 read_cnt = read(sockfd,recvs,MAXSIZE);
68 if(0 == read_cnt)
69 {
70 break;
71 }
72 printf("->");
73 fwrite(recvs,1,read_cnt,fd);
74 }
75 printf("\nSuccess!\n");
76 }
77 else
78 {
79 //上传文件
80 printf("\n Put the File:%s From Ip:%s:%s,Copy the local file:%s\n",argv[4],argv[2],argv[3],argv[5]);
81
82 //写入控制信息
83 write(sockfd,put_ch,sizeof(get_ch)); //上传命令
84 write(sockfd,argv[4],strlen(argv[4])); //存储文件名
85
86 //发送文件
87 printf("\nNow:Send the file\n");
88 while(!feof(fd))
89 {
90 int len=fread(send,1,MAXSIZE,fd);
91 write(sockfd,send,len);
92 printf("->");
93 }
94 printf("\nsuccess!\n");
95 }
96 close(sockfd);
97 fclose(fd);
98 exit(EXIT_SUCCESS);
99 }

浙公网安备 33010602011771号