文件传输

该程序在linux下面运行

分别写了服务器端与客户端以下是代码:

server.c

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define SA struct sockaddr
#define BUFFER_SIZE 1024
#define LISTEN 5


char * namercve(int fd ,char * name)
{
   int bytes_recv;
   bytes_recv=read(fd,name,sizeof(name));
   if(bytes_recv<=0)
     return NULL;
   name[bytes_recv]='/0';
     return name;
}


int main(int argc,char **argv)
{
    int from_fd,to_fd;
    char buffer[BUFFER_SIZE];
    char name[50];
    int bytes_read,bytes_write;
    char *ptr;
    struct sockaddr_in servaddr,cliaddr;
    int  listenfd;
    socklen_t len;
    /*  if(argc!=3)
    {
     printf("Usage: %s from file to file /n/a",argv[0]);
     exit(1);
    }*/

 

       if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){
            printf("%s/n",strerror(errno));
            exit(0);
       }
       printf("get socket descriptor success!/n");

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

       if(bind(listenfd,(SA *) &servaddr,sizeof(servaddr))==0)
          printf("bind success!/n");

       if(listen(listenfd,LISTEN)==0)
          printf("begin listenning:/n");
 for(;;){
        
          len = sizeof(cliaddr);
           to_fd = accept(listenfd,(SA *) &cliaddr,&len);
           printf("client锛?s/n",inet_ntoa(cliaddr.sin_addr));

    if(!namercve(to_fd,name))
       exit(0);

/*open the source file*/
if((from_fd=open(name,O_RDONLY))==-1)
{
   printf("Open %s Error : %s /n",argv[1],strerror(errno));
   exit(1);
}
/*create dirction file*/
/*if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
   printf("Open %s Error: %s/n",argv[2],strerror(errno));
   exit(1);
}
*/
/*the following is a classic file-copying code.*/
        
     while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
          /*A critical mistake occures*/
   if((bytes_read==-1)&&(errno!=EINTR)) break;
          /*All bits have been writen down.*/
   else if(bytes_read>0)
   {
    ptr=buffer;
    while(bytes_write=write(to_fd,ptr,bytes_read))
     {
      if((bytes_write==-1)&&(errno!=EINTR)) break;
      else if (bytes_write==bytes_read) break;
      else if(bytes_write>0)
       {
        ptr+=bytes_write;
        bytes_read-=bytes_write;
       }
     }
   if(bytes_write==-1) break;
   }
}
close(from_fd);
close(to_fd);
}
exit(0);  
}

 

 

client.c

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define BUFFER_SIZE 1024

int  namesend(int fd,char *name)
{

    int bytes_write;
    bytes_write=write(fd,name,sizeof(name));      
  
    if(bytes_write<=0)
     return 0;
     return 1;
}

int main(int argc,char **argv)
{
   int from_fd,to_fd;
   //int sockfd;
   struct sockaddr_in  servaddr;
   char buffer[BUFFER_SIZE];
   int bytes_read,bytes_write;
   char *ptr;

   if(argc!=3)
    {
      printf("Usage: %s from file to file /n/a",argv[0]);
      exit(1);
    }

 

   if((from_fd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
     perror("socket:");
     exit(errno);
    }


   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family  = AF_INET;
   servaddr.sin_port    = htons(atoi("5566"));
  
   if(inet_aton("localhost",&servaddr.sin_addr)<0)
   {
   perror("inet_aton:");
   exit(errno);
   }
  
    
   if(connect(from_fd,(struct sockaddr *) &servaddr,sizeof(servaddr))<0)
   {
   perror("connect:");
   exit(errno);
   }

/*open the source file*/
/*if((from_fd=open(argv[1],O_RDONLY))==-1)
{
   printf("Open %s Error : %s /n",argv[1],strerror(errno));
   exit(1);
}
*/
/*create dirction file*/
 
  if(namesend(from_fd,argv[1])==0)
      exit(0);

 

   if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
   {
   printf("Open %s Error: %s/n",argv[2],strerror(errno));
   exit(1);
   }
/*the following is a classic file-copying code.*/
 
   while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
   {
          /*A critical mistake occures*/
   if((bytes_read==-1)&&(errno!=EINTR)) break;
          /*All bits have been writen down.*/
   else if(bytes_read>0)
   {
    ptr=buffer;
    while(bytes_write=write(to_fd,ptr,bytes_read))
     {
      if((bytes_write==-1)&&(errno!=EINTR)) break;
      else if (bytes_write==bytes_read) break;
      else if(bytes_write>0)
       {
        ptr+=bytes_write;
        bytes_read-=bytes_write;
       }
     }
   if(bytes_write==-1) break;
   }
}
   close(from_fd);
   close(to_fd);
   exit(0);  
}

 

 

以上是源代码。用法下次在说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值