520作业

#define PORT 69
#define IP "192.168.125.54"
 
char buf[256]=“”;
void print_menu();
void upload(const char* filename);
void download(const char* filename);
 

 
void menu() {
    puts("**************************************");
    puts("***************1 上传*****************");
    puts("***************2 下载*****************");
    puts("***************3 退出*****************");
    puts("**************************************");
}
 
void upload(const char* filename) {
    char* filename_ptr = buf + 2;
    strcpy(filename_ptr, filename);


    char* mode_ptr = filename_ptr + strlen(filename_ptr) + 1;
    int req_len = 4 + strlen(filename_ptr) + strlen(mode_ptr);


    sendto(sockfd, buf, req_len, 0, (struct sockaddr*)&ser_sockaddr, sizeof(struct sockaddr));
    socklen_t sockaddr_len = sizeof(struct sockaddr);
    recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&ser_sockaddr, &sockaddr_len);
    if (ntohs(*(short*)buf) == 5) {
        printf("%s\n", buf + 4);
        return;
    }
 
    int i = 1; 
    int rfd = open(filename, O_RDONLY);
    if (rfd == -1) {
        perror("open");
        return;
    }
 
    while (1) {
        *op_ptr = htons(3);
        short* blocknum_ptr = (short*)(buf + 2);
        *blocknum_ptr = htons(i++);
        int ret = read(rfd, buf + 4, 512);
        sendto(sockfd, buf, ret + 4, 0, (struct sockaddr*)&ser_sockaddr, sockaddr_len);

        recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&ser_sockaddr, &sockaddr_len);
        if (ntohs(*(short*)buf) == 5) {
            printf("%s\n", buf + 4);
            close(rfd);
            return;
        }
        if (ret < 512) {
            puts("上传完成");
            close(rfd);
            return;
        }
    }
}
 
void download(const char* filename) {
    // 发送读请求
    short* op_ptr = (short*)buf;
    *op_ptr = htons(1);
 
    char* filename_ptr = buf + 2;
    strcpy(filename_ptr, filename);
 
    char* mode_ptr = filename_ptr + strlen(filename_ptr) + 1;

 
    int req_len = 4 + strlen(filename_ptr) + strlen(mode_ptr);
    sendto(sockfd, buf, req_len, 0, (struct sockaddr*)&ser_sockaddr, sizeof(struct sockaddr));
 
    int wfd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0666);
    if (wfd == -1) {
        perror("open");
        return;
    }
 
    int i = 1;     
    socklen_t sockaddr_len = sizeof(struct sockaddr);
    while (1) {

        int ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&ser_sockaddr, &sockaddr_len);
        if (ret < 0) {
            perror("recvfrom");
            close(wfd);
            return;
        }
 
        write(wfd, buf + 4, ret - 4);
 
  
        *op_ptr = htons(4);
 
        short* blocknum_ptr = (short*)(buf + 2);
        *blocknum_ptr = htons(i++);
        sendto(sockfd, buf, 4, 0, (struct sockaddr*)&ser_sockaddr, sockaddr_len);
 
            close(wfd);
            return;
        }
    }

int main(int argc, const char *argv[])
{
    char num;  
    char filename[30];
     int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == -1) {
        perror("socket");
        return -1;
    }
 
    sin_sockaddr.sin_family = AF_INET;
    sin_sockaddr.sin_port = htons(PORT);
    sin_sockaddr.sin_addr.s_addr = inet_addr(IP);
    menu();
    while (1) {
        printf("请选择");
        scanf(" %c", &num);
        switch (num) {
        case '1':
            printf("请输入上传文件名");
            scanf("%s", filename);
            upload(filename);
            break;
        case '2':
            printf("请输入下载文件名");
            scanf("%s", filename);
            download(filename);
            break;
        case '3':
            system("clear");
            print_menu();
            break;
        case '4':
            close(sfd);
            return 0;
        default:
            puts("输入错误,请重新输入");
        }
    }
 
    return 0;
}
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值