📄 udpclient.c.bak
字号:
#include <stdlib.h> #include <stdio.h>#include <string.h>#include <time.h>#include <fcntl.h>#include <ctype.h>#include <unistd.h>#include <netdb.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include "process.h"struct dtgram{ unsigned short opcode; unsigned short block; char databuf[512];}; int main(int argc,char *argv[]){ int fdSock; int iRetSock,iRetFile; struct sockaddr_in myAddr,svrAddr; struct dtgram obj; char szFileName[BUFMAX]; char * parg[ARGMAX]; unsigned short * popcode; int i; FILE *pFile; int len = sizeof(svrAddr); fdSock=socket(AF_INET,SOCK_DGRAM,0); myAddr.sin_family=AF_INET; myAddr.sin_port=htons(0); myAddr.sin_addr.s_addr=htonl(INADDR_ANY); bind(fdSock,(struct sockaddr *)&myAddr,sizeof(myAddr)); ///////////////////// svrAddr.sin_family=AF_INET; if (argc == 2) svrAddr.sin_addr.s_addr=inet_addr(argv[2]); else if (argc == 1) svrAddr.sin_addr.s_addr=inet_addr("192.168.0.5"); else { printf("Bad optional! Bye...\n"); exit(-1); } while (1) { i = 1; svrAddr.sin_port=htons(69); printf("tftp:>"); fgets(szFileName, BUFMAX - 1, stdin); if ('\n' == szFileName[0]) continue; process(szFileName, parg); if (strcmp(parg[0], "quit") == 0 || strcmp(parg[0], "exit") == 0) break; if (strcmp(parg[0], "get") == 0 && strlen(parg[1]) > 0) { obj.opcode = 1; popcode = (unsigned short *)obj.databuf; *popcode = htons(obj.opcode); strcpy(&obj.databuf[2], parg[1]); strcpy(&obj.databuf[2 + strlen(parg[1]) + 1], "octet"); if((pFile = fopen(parg[1],"wb")) == NULL) { printf("create file %s failed\n",parg[1]); exit(-1); } iRetFile = strlen(parg[1]) + strlen("octet") + 4; iRetSock=sendto(fdSock,obj.databuf,iRetFile,0,(struct sockaddr *)&svrAddr,len); if(iRetSock != iRetFile) { perror("send filename failed"); close(fdSock); fclose(pFile); exit(-2); } //在这个地方最好对发出的读请求是否到达进行确认,因为不排除读请求包丢失的可能 while(2) { iRetSock=recvfrom(fdSock,obj.databuf,sizeof(obj.databuf),0,(struct sockaddr *)&svrAddr,&len); if(iRetSock<1) { perror("Recv error"); break; } obj.opcode = ntohs(*(unsigned short *)obj.databuf); obj.block = ntohs(*(unsigned short *)(&obj.databuf[2])); if (obj.opcode == 3) { obj.opcode = 4; popcode = (unsigned short *)obj.databuf; *popcode = htons(obj.opcode); if (sendto(fdSock,obj.databuf,4,0,(struct sockaddr *)&svrAddr,sizeof(svrAddr)) != 4) { perror("send ACK failed"); close(fdSock); fclose(pFile); exit(-2); } if (obj.block == i) { fwrite(&obj.databuf[4], iRetSock - 4, 1, pFile); if ((iRetSock - 4) < 512) { fclose(pFile); break; //break while(2) } i++; } } else { printf("So bad, The file %s is not exist!\n", parg[1]); //用于调试 fclose(pFile); unlink(parg[1]); break; //break while(2) } } } else { puts("Bad command!"); continue; //continue while(1) } } puts("Bye!"); close(fdSock); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -