#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;
}
}