tcp文件服务器

客户端:
int process_list(struct sockaddr_in *addr,char * buf)
{
int ret,sockfd,nbytes;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror(“socket”);
exit(-1);
}
ret = connect(sockfd,(struct sockaddr *)addr,sizeof(*addr)) ;
if(ret < 0)
{
perror(“connect”);
exit(-1);
}
ret = write(sockfd,buf,N);
if(ret < 0)
{
perror(“write”);
exit(-1);
}
while( (nbytes= read(sockfd,buf,N)) > 0)
{
printf("%s\n",buf);
}
close(sockfd);

return 0;

}
int process_get(struct sockaddr_in *addr,char * buf)
{
int ret,sockfd,nbytes,fd;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror(“socket”);
exit(-1);
}
ret = connect(sockfd,(struct sockaddr *)addr,sizeof(*addr)) ;
if(ret < 0)
{
perror(“connect”);
exit(-1);
}
ret = write(sockfd,buf,N);
if(ret < 0)
{
perror(“write”);
exit(-1);
}
fd = open(buf+4,O_RDWR|O_CREAT|O_TRUNC,0664);
if(fd < 0)
{
perror(“open”);
exit(-1);
}
while( (nbytes= read(sockfd,buf,N)) > 0)
{
ret = write(fd,buf,nbytes);
if(ret < 0)
{
perror(“write”);
exit(-1);
}
}
close(sockfd);
return 0;
}
int process_put(struct sockaddr_in *addr,char * buf)
{
int ret,sockfd,nbytes,fd;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror(“socket”);
exit(-1);
}
ret = connect(sockfd,(struct sockaddr *)addr,sizeof(*addr)) ;
if(ret < 0)
{
perror(“connect”);
exit(-1);
}
ret = write(sockfd,buf,N);
if(ret < 0)
{
perror(“write”);
exit(-1);
}
fd = open(buf+4,O_RDWR);
if(fd < 0)
{
perror(“open”);
exit(-1);
}
while( (nbytes= read(fd,buf,N)) > 0)
{
ret = write(sockfd,buf,nbytes);
if(ret < 0)
{
perror(“write”);
exit(-1);
}
}
close(sockfd);
close(fd);
return 0;
}
int main(int argc, const char *argv[])
{

char buf[N] = {0};
int sockfd,ret;
struct sockaddr_in server,client;
if(argc != 3)
{
    printf();
    exit(-1);
}
memset(&server,0,sizeof(server));
server.sin_family = AF_INET ;
server.sin_port   = htons( atoi(argv[2]) );
server.sin_addr.s_addr   = inet_addr(argv[1]); 
while(1)
{
    printf(">:");
    fgets(buf,N,stdin);
    buf[strlen(buf)-1] = '\0';
    if( strncmp(buf,"list",4) == 0 ) 
    {
        process_list(&server,buf);
    }
    else if( strncmp(buf,"get",3) == 0 ) 
    {
        process_get(&server,buf);
    }
    else if( strncmp(buf,"put",3) == 0 ) 
    {
        process_put(&server,buf);
    }
    else if( strncmp(buf,"quit",4) == 0 ) 
    {
        break;
    }
    else if( strncmp(buf,"exit",4) == 0 ) 
    {
        break;
    }
    else 
    {
        printf();
    }
    
}

服务器:

int process_list(int newsockfd,char *buf)
{

DIR * dirp;
int ret;
struct dirent * direntp;
dirp = opendir("./");
if(dirp == NULL)
{
    perror("opendir");
    exit(-1);
}
while( (direntp = readdir(dirp)) != NULL)
{
    if(strncmp(direntp->d_name,".",1) == 0 ) continue; 
    strcpy(buf,direntp->d_name);
    ret = write(newsockfd,buf,N);
    if(ret < 0)
    {
        perror("write");
        exit(-1);
    }
}
close(newsockfd);


return 0;

}
int process_get(int newsockfd,char *buf)
{

int ret,fd,nbytes;

fd = open(buf+4,O_RDWR);
if(fd < 0)
{
    perror("open");
    exit(-1);
}
while( (nbytes= read(fd,buf,N)) > 0)
{
    ret = write(newsockfd,buf,nbytes);
    if(ret < 0)
    {
        perror("write");
        exit(-1);
    }
}
close(newsockfd);


return 0;

}
int process_put(int newsockfd,char *buf)
{

int ret,fd,nbytes;

fd = open(buf+4,O_RDWR|O_CREAT|O_TRUNC,0664);
if(fd < 0)
{
    perror("open");
    exit(-1);
}
while( (nbytes= read(newsockfd,buf,N)) > 0)
{
    ret = write(fd,buf,nbytes);
    if(ret < 0)
    {
        perror("write");
        exit(-1);
    }
}
close(newsockfd);
close(fd);


return 0;

}
int main(int argc, const char *argv[])
{
char buf[N] ={0};
int sockfd,ret,newsockfd;
struct sockaddr_in myaddr,client;
if(argc != 3)
{
printf();
exit(-1);
}
socklen_t addrlen = sizeof(client);
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror(“socket”);
exit(-1);
}
printf(“sockfd=%d\n”,sockfd);
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET ;
myaddr.sin_port = htons(atoi(argv[2]));
myaddr.sin_addr.s_addr = inet_addr(argv[1]);
ret = bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)) ;
if(ret < 0)
{
perror(“bind”);
exit(-1);
}
ret = listen(sockfd,10);
if(ret < 0)
{
perror(“listen”);
exit(-1);
}
while(1)
{
newsockfd = accept(sockfd,(struct sockaddr *)&client,&addrlen) ;
if(newsockfd < 0)
{
printf(“accept”);
exit(-1);
}
printf(“newsockfd = %d\n”,newsockfd);
ret = read(newsockfd,buf,N);
if(ret < 0)
{
printf(“read”);
exit(-1);
}
printf(“buf=%s\n”,buf);
if( strncmp(buf,“list”,4) == 0 )
{
process_list(newsockfd,buf);
}
else if( strncmp(buf,“get”,3) == 0 )
{
process_get(newsockfd,buf);
}
else if( strncmp(buf,“put”,3) == 0 )
{
process_put(newsockfd,buf);
}
}

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值