📄 file_receive.c
字号:
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <unistd.h>#include <fcntl.h>#define MAX_BUF_SIZE 1024#define SERVPORT 6666struct context{ int flag; /* 1: file name , 2: file data , 3: file end , other: error */ int counts; char data[MAX_BUF_SIZE];};int main( void ){ struct sockaddr_in server_sockaddr,client_sockaddr; int sin_size,recvbytes,receivepkgs=0; int sockfd,client_fd,receivefilefd,writebytes; char buf[MAX_BUF_SIZE]; struct context receivecontext; if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(1); } printf("socket success!,sockfd=%d\n",sockfd); server_sockaddr.sin_family=AF_INET; server_sockaddr.sin_port=htons(SERVPORT); server_sockaddr.sin_addr.s_addr=INADDR_ANY; bzero((char *)&(server_sockaddr.sin_zero),8); if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1) { perror("bind"); exit(1); } printf("bind success!\n"); if(listen(sockfd,10)==-1) { perror("listen"); exit(1); } printf("listening....\n"); if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1) { perror("accept"); close(sockfd); exit(1); } while(1) { if((recvbytes=recv(client_fd,&receivecontext,sizeof(struct context),0))==-1) { perror("recv"); close(sockfd); exit(1); } printf("flag==%d, ",receivecontext.flag); switch(receivecontext.flag) { case 1: { if((receivefilefd = open(receivecontext.data,O_CREAT|O_RDWR,0666)) < 0) { perror("open!!!..\n"); close(sockfd); exit(1); } printf("open file %s,fd: %d......\n", receivecontext.data,receivefilefd ); break; } case 2: { if((writebytes = write(receivefilefd,receivecontext.data,receivecontext.counts)) < 0) { perror("write!!!..\n"); close(sockfd); exit(1); } else printf("write file fd: %d, packages: %d , %d chars........\n ",receivefilefd,++receivepkgs,writebytes); break; } case 3: { if((writebytes = write(receivefilefd,'\0',1)) < 0) { perror("write!!!..\n"); exit(1); } close(receivefilefd); close(sockfd); printf("reveive is end !!!\n"); return 0; break; } default: { perror("error"); close(sockfd); exit(-1); break; } } } close(sockfd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -