- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #define PORT 6000
- #define LISTENQ 20
- #define BUFFSIZE 4096
- #define FILE_NAME_MAX_SIZE 512
- int main(int argc, char **argv[])
- {
- //Input the file name
- char filename[FILE_NAME_MAX_SIZE];
- bzero(filename,FILE_NAME_MAX_SIZE);
- printf("Please input the file name you wana to send:");
- scanf("%s",&filename);
- getchar();
- //Create socket
- int sockfd,connfd;
- struct sockaddr_in svraddr,clientaddr;
- bzero(&svraddr,sizeof(svraddr));
- svraddr.sin_family=AF_INET;
- svraddr.sin_addr.s_addr=htonl(INADDR_ANY);
- svraddr.sin_port=htons(PORT);
- sockfd=socket(AF_INET,SOCK_STREAM,0);
- if(sockfd<0)
- {
- perror("socket");
- exit(1);
- }
- //bind
- if(bind(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr))<0)
- {
- perror("bind");
- exit(1);
- }
- //listen
- if(listen(sockfd,LISTENQ)<0)
- {
- perror("listen");
- exit(1);
- }
- while(1)
- {
- socklen_t length=sizeof(clientaddr);
- //accept
- connfd=accept(sockfd,(struct sockaddr*)&clientaddr,&length);
- if(connfd<0)
- {
- perror("connect");
- exit(1);
- }
- //send file imformation
- char buff[BUFFSIZE];
- int count;
- bzero(buff,BUFFSIZE);
- strncpy(buff,filename,strlen(filename)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(filename));
- printf("buff=[%s]\\n",buff);
- count=send(connfd,buff,BUFFSIZE,0);
- if(count<0)
- {
- perror("Send file imformation");
- exit(1);
- }
- //read file
- FILE *fd=fopen(filename,"rb");
- if(fd==NULL)
- {
- printf("File :%s not found!\\n",filename);
- }
- else
- {
- bzero(buff,BUFFSIZE);
- int file_block_length=0;
- while((file_block_length=fread(buff,sizeof(char),BUFFSIZE,fd))>0)
- {
- printf("file_block_length:%d\\n",file_block_length);
- if(send(connfd,buff,file_block_length,0)<0)
- {
- perror("Send");
- exit(1);
- }
- bzero(buff,BUFFSIZE);
- }
- fclose(fd);
- printf("Transfer file finished !\\n");
- }
- close(connfd);
- }
- close(sockfd);
- return 0;
- }
- client.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #define PORT 6000
- #define LISTENQ 20
- #define BUFFSIZE 4096
- #define FILE_NAME_MAX_SIZE 512
- int main(int argc, char **argv[])
- {
- int clientfd;
- if(argc!=2)
- {
- fprintf(stderr,"Usage:./fileclient <IP_Address>\\n");
- exit(1);
- }
- struct sockaddr_in clientaddr;
- bzero(&clientaddr,sizeof(clientaddr));
- clientaddr.sin_family=AF_INET;
- clientaddr.sin_addr.s_addr=htons(INADDR_ANY);
- clientaddr.sin_port=htons(0);
- clientfd=socket(AF_INET,SOCK_STREAM,0);
- if(clientfd<0)
- {
- perror("socket");
- exit(1);
- }
- if(bind(clientfd,(struct sockaddr*)&clientaddr,sizeof(clientaddr))<0)
- {
- perror("bind");
- exit(1);
- }
- struct sockaddr_in svraddr;
- bzero(&svraddr,sizeof(svraddr));
- if(inet_aton(argv[1],&svraddr.sin_addr)==0)
- {
- perror("inet_aton");
- exit(1);
- }
- svraddr.sin_family=AF_INET;
- svraddr.sin_port=htons(PORT);
- socklen_t svraddrlen=sizeof(svraddr);
- if(connect(clientfd,(struct sockaddr*)&svraddr,svraddrlen)<0)
- {
- perror("connect");
- exit(1);
- }
- //recv file imformation
- char buff[BUFFSIZE];
- char filename[FILE_NAME_MAX_SIZE];
- int count;
- bzero(buff,BUFFSIZE);
- count=recv(clientfd,buff,BUFFSIZE,0);
- if(count<0)
- {
- perror("recv");
- exit(1);
- }
- strncpy(filename,buff,strlen(buff)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buff));
- printf("Preparing recv file : %s from %s \\n",filename,argv[1]);
- //recv file
- FILE *fd=fopen(filename,"wb+");
- if(NULL==fd)
- {
- perror("open");
- exit(1);
- }
- bzero(buff,BUFFSIZE);
- int length=0;
- while(length=recv(clientfd,buff,BUFFSIZE,0))
- {
- if(length<0)
- {
- perror("recv");
- exit(1);
- }
- int writelen=fwrite(buff,sizeof(char),length,fd);
- if(writelen<length)
- {
- perror("write");
- exit(1);
- }
- bzero(buff,BUFFSIZE);
- }
- printf("Receieved file:%s from %s finished!\\n",filename,argv[1]);
- fclose(fd);
- close(clientfd);
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/1501201511543.html
来源: http://www.codesnippet.cn/detail/1501201511543.html