udpReceiver.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include"udpReceiver.h"
  2. #include"usermanager.h"
  3. #include"msgManager.h"
  4. #include"fileManager.h"
  5. #include"definations.h"
  6. #include"chaos.h"
  7. #include"include/ipmsg.h"
  8. #include"fixedmath.h"
  9. #include"packMaker.h"
  10. #include<sys/types.h>
  11. #include<netinet/in.h>
  12. #include<sys/socket.h>
  13. #include<arpa/inet.h>
  14. #include<errno.h>
  15. #include<cstdio>
  16. #include<unistd.h>
  17. #include<cstring>
  18. #include<cstdlib>
  19. static Chaos* chaos=0;
  20. static UserManager* users=0;
  21. static MsgManager* msgs=0;
  22. static FileManager* filels=0;
  23. static char ver[40]={0};
  24. static char raw_pkgnum[30];
  25. static unsigned pkgnum;
  26. static char sysusrname[100]={0};
  27. static char computername[100]={0};
  28. static char raw_command[30];
  29. static unsigned command;
  30. static int optstart;
  31. static user_t tmpusr;
  32. static char *(dest[15])={
  33. tmpusr.usrname,
  34. tmpusr.grpname,
  35. tmpusr.macaddr,
  36. tmpusr.space01,
  37. tmpusr.phone,
  38. tmpusr.mail,
  39. tmpusr.printer,
  40. tmpusr.space02,
  41. tmpusr.ipaddr,
  42. tmpusr.space03,
  43. tmpusr.icon,
  44. tmpusr.netstatus,
  45. tmpusr.sign,
  46. };
  47. static bool needreply=false;
  48. void* thd_udpReceiver(void*){
  49. //init..
  50. chaos=Chaos::getInstance();
  51. if(unlikely(chaos==NULL)){
  52. printf("\e[31mFatel error:\e[0mChaos not exist.\n");
  53. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,chaos,errno);
  54. exit(1);
  55. }
  56. users=UserManager::getInstance();
  57. if(unlikely(users==NULL)){
  58. printf("\e[31mFatel error:\e[0mUserManager not exist.\n");
  59. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,users,errno);
  60. exit(1);
  61. }
  62. msgs=MsgManager::getInstance();
  63. if(unlikely(msgs==NULL)){
  64. printf("\e[31mFatel error:\e[0mMsgManager not exist.\n");
  65. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,msgs,errno);
  66. }
  67. filels=FileManager::getInstance();
  68. if(unlikely(filels==NULL)){
  69. printf("\e[31mFatel error:\e[0mFileManager not exist.\n");
  70. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,filels,errno);
  71. }
  72. struct sockaddr_in s_addr;
  73. struct sockaddr_in c_addr;
  74. int sock;
  75. socklen_t addr_len;
  76. int len;
  77. char buff[BUFFLEN];
  78. sock=socket(AF_INET,SOCK_DGRAM,0);
  79. int opt=1;
  80. setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt));
  81. if(unlikely(sock==-1)){
  82. printf("\e[31mFatel error:\e[0mUDP init error.\n");
  83. dpf("%s,%d,%d,%d\n",__FILE__,__LINE__,sock,errno);
  84. exit(1);
  85. }
  86. memset(&s_addr,0,sizeof(struct sockaddr_in));
  87. s_addr.sin_family = AF_INET;
  88. s_addr.sin_port = htons(PORT);
  89. s_addr.sin_addr.s_addr=INADDR_ANY;
  90. int funcAns = bind(sock,(struct sockaddr*)&s_addr,sizeof(s_addr));
  91. if(unlikely(funcAns==-1)){
  92. printf("\e[31mFatel error:\e[0mUDP init error.\n");
  93. dpf("%s,%d,%d,%d\n",__FILE__,__LINE__,funcAns,errno);
  94. exit(1);
  95. }
  96. addr_len=sizeof(c_addr);
  97. chaos->udpsocket=sock;
  98. chaos->udpListen=true;
  99. while(chaos->programOK){
  100. len=recvfrom(sock,buff,sizeof(buff)-1,0,(struct sockaddr*)&c_addr,&addr_len);
  101. if(unlikely(len<0)){
  102. dpf("recvfrom error,%d\n",errno);
  103. sleep(1);
  104. continue;
  105. }
  106. buff[len]=0;
  107. dpf("%s\n",buff);
  108. ver[0]=raw_pkgnum[0]=sysusrname[0]=computername[0]=raw_command[0]=0;
  109. sscanf(buff,"%[0-9a-zA-Z.]:%[0-9]:%[^:]:%[^:]:%[0-9]:%n",
  110. ver,raw_pkgnum,sysusrname,computername,raw_command,&optstart);
  111. if((ver[0]==0)||(raw_pkgnum[0]==0)||(sysusrname[0]==0)||
  112. (computername[0]==0)||(raw_command[0]==0)){
  113. dpf("\e[33munpack error:not a pack\e[0m\n");
  114. continue;
  115. }
  116. command=u32atoi(raw_command);
  117. dpf("mode:%lx\n",GET_MODE(command));
  118. switch(GET_MODE(command)){
  119. case IPMSG_BR_ENTRY:
  120. needreply=true;
  121. case IPMSG_ANSENTRY:{
  122. //USR LIST UPDATE
  123. tmpusr.ip.sin_addr.s_addr=c_addr.sin_addr.s_addr;
  124. strcpy(tmpusr.sysusrname,sysusrname);
  125. strcpy(tmpusr.computername,computername);
  126. for(int i=optstart,cnt=0,sz=0;i<=len;i++){
  127. if(buff[i])dest[cnt][sz++]=buff[i];
  128. else{
  129. dest[cnt][sz++]=0;
  130. cnt++;
  131. if(cnt>12)break;
  132. sz=0;
  133. }
  134. }
  135. tmpusr.healthy=true;
  136. int ans=users->Adduser(tmpusr);
  137. if(ans==FUNCSUCCEED){
  138. }
  139. if(needreply){
  140. char buff[BUFFLEN];
  141. int len=0;
  142. len=mkHeartPack(buff,IPMSG_ANSENTRY);
  143. sendto(sock,buff,len,0,(struct sockaddr*)&c_addr,addr_len);
  144. }
  145. dpf("ans entry done\n");
  146. break;
  147. }
  148. case IPMSG_BR_EXIT:{
  149. //USR LIST DELETE
  150. int ans=users->Deluser(c_addr);
  151. if(ans==FUNCSUCCEED){
  152. }
  153. break;
  154. }
  155. case IPMSG_SENDMSG:{
  156. if((GET_OPT(command)&IPMSG_FILEATTACHOPT)==IPMSG_FILEATTACHOPT){
  157. recvfile_t tmprecvf;
  158. char tmpstr[512];
  159. tmprecvf.tarIp=c_addr.sin_addr.s_addr;
  160. sscanf(buff+optstart+1,"%u:%[^:]:%x:%u:%u",&(tmprecvf.fileno),tmpstr,
  161. &(tmprecvf.filesize),&(tmprecvf.time),&(tmprecvf.filetype));
  162. tmprecvf.filename=tmpstr;
  163. tmprecvf.fileno;
  164. filels->Addrecv(tmprecvf);
  165. }else{
  166. msg_t tmpmsg;
  167. tmpmsg.ip=c_addr.sin_addr.s_addr;
  168. strrchr(buff,'[')[0]=0;
  169. strrchr(buff,'[')[0]=0;
  170. tmpmsg.msg=buff+optstart;
  171. msgs->PushMsg(tmpmsg);
  172. }
  173. if(GET_OPT(command)|IPMSG_SENDCHECKOPT){
  174. char rtnbuff[BUFFLEN];
  175. int rtnlen=0;
  176. rtnlen=mkHeader(rtnbuff,IPMSG_RECVMSG);
  177. rtnlen+=sprintf(rtnbuff+rtnlen,"%s",raw_pkgnum);
  178. sendto(sock,rtnbuff,rtnlen,0,(struct sockaddr*)&c_addr,addr_len);
  179. }
  180. break;
  181. }
  182. case IPMSG_EX_CHATREADY:{
  183. char sendbuff[BUFFLEN];
  184. int sendlen=0;
  185. sendlen=mkHeader(sendbuff,IPMSG_RECVMSG);
  186. sendlen+=sprintf(sendbuff+sendlen,"%s",raw_pkgnum);
  187. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  188. if(buff[optstart]=='6'){
  189. sendlen=mkHeader(sendbuff,IPMSG_EX_CHATREADY);
  190. sendlen+=sprintf(sendbuff+sendlen,"5")+1;
  191. sendlen+=sprintf(sendbuff+sendlen,"1")+1;
  192. sendlen+=sprintf(sendbuff+sendlen,"123");
  193. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  194. }else if(buff[optstart]=='5'){
  195. user_t tmp;
  196. int findans=users->Finduser(tmp,c_addr);
  197. if(findans==FUNCSUCCEED){
  198. sendlen=mkHeader(sendbuff,IPMSG_EX_CHATCHECKMAC);
  199. sendlen+=sprintf(sendbuff+sendlen,"%s",tmp.macaddr);
  200. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  201. }
  202. }
  203. break;
  204. }
  205. case IPMSG_EX_CHATCHECKMAC:{
  206. char sendbuff[BUFFLEN];
  207. int sendlen=0;
  208. sendlen=mkHeader(sendbuff,IPMSG_RECVMSG);
  209. sendlen+=sprintf(sendbuff+sendlen,"%s",raw_pkgnum);
  210. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  211. break;
  212. }
  213. case IPMSG_EX_REFUSEFILE:{
  214. unsigned tmpfno;
  215. int optsplit=0;
  216. sscanf(buff+optstart+optsplit,"%x%n",&tmpfno,&optsplit);
  217. optsplit++;
  218. sscanf(buff+optstart+optsplit,"%x",&tmpfno);
  219. printf("%d",tmpfno);
  220. filels->Delsend(tmpfno,c_addr.sin_addr.s_addr);
  221. break;
  222. }
  223. case IPMSG_EX_CANCELFILE:{
  224. unsigned tmpfno;
  225. int optsplit=0;
  226. sscanf(buff+optstart+optsplit,"%x%n",&tmpfno,&optsplit);
  227. optsplit++;
  228. sscanf(buff+optstart+optsplit,"%x",&tmpfno);
  229. filels->Delrecv(tmpfno,c_addr.sin_addr.s_addr);
  230. break;
  231. }
  232. case IPMSG_EX_PREGETFILE:{
  233. unsigned sendlen;
  234. char sendbuff[BUFFLEN];
  235. sendlen=mkHeader(sendbuff,IPMSG_SENDMSG);
  236. sendlen+=sprintf(sendbuff+sendlen,"Unsupported function!")+1;
  237. sendlen+=sprintf(sendbuff+sendlen,"%s",fontmagic);
  238. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  239. break;
  240. }
  241. default:
  242. dpf("\e[36mUnset command:%X\e[0m\n",command);
  243. break;
  244. }
  245. needreply=false;
  246. }
  247. }