客户端往服务器端传送文件

来源:互联网 发布:js的 math.hypot方法 编辑:程序博客网 时间:2024/05/24 04:32
客户端
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define MAXLINE 80#define SERV_PORT 8000int mycp(int fd,int socketfd)  /*文件复制*/{char buf[128];int ret,rret;int wdest;bzero(buf,128);while((ret=read(fd,buf,128))>0){wdest=write(socketfd,buf,ret);rret=ret-wdest;while(rret!=0){wdest=write(socketfd,&buf[wdest],rret);rret=ret-wdest;}bzero(buf,128);}return 0;}int main(int argc,char *argv[])/*客户端*/{struct sockaddr_in servaddr;char buf[MAXLINE];int sockfd;char *str;int fd;fd=open(argv[1],O_RDONLY);if(fd<0){printf("open error\n");return -1;}if(argc!=2){fputs("usage:./client message\n",stderr);exit(1);}str=argv[1];sockfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);servaddr.sin_port=htons(SERV_PORT);connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));write(sockfd,str,strlen(str)+1);/*将文件名写过去*/mycp(fd,sockfd);/*sockfd也是一文件描述符,将客户端文件复制给sockfd*/close(fd);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 <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

#define MAXLINE 80#define SERV_PORT 8000int mycp(int listenfd,int fd){ char buf[128]; int ret,rret; int wdest;

 bzero(buf,128);

 while((ret=read(listenfd,buf,128))>0){  wdest=write(fd,buf,ret);  rret=ret-wdest;

  while(rret!=0){   wdest=write(fd,&buf[wdest],rret);   rret=ret-wdest;  }  bzero(buf,128);

 } return 0;}

int main(void){ struct sockaddr_in servaddr,cliaddr; socklen_t cliaddr_len; int listenfd,connfd; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int i,n; int fd;

 listenfd=socket(AF_INET,SOCK_STREAM,0);

 bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(SERV_PORT);

 bind(listenfd,(struct sockaddr *)&servaddr,   sizeof(servaddr)); listen(listenfd,20);

 printf("Accepting connections ...\n"); while(1){  cliaddr_len=sizeof(cliaddr);  connfd=accept(listenfd,(struct sockaddr *)&cliaddr,    &cliaddr_len);  n=read(connfd,buf,MAXLINE);/*读文件名*/  fd=open(buf,O_RDWR|O_TRUNC|O_CREAT,0666);  mycp(connfd,fd);/*connfd也文件描述符,将其内容复制到fd,实现文件拷贝*/

  printf("received from %s at PORT %d\n",    inet_ntop(AF_INET,&cliaddr.sin_addr,str,     sizeof(str)),    ntohs(cliaddr.sin_port));

  close(fd);  close(connfd);    } return 0;}

客户端与服务器传送文件之间用sockfd和connfd联系

原创粉丝点击