global.cpp
上传用户:shsts1
上传日期:2013-03-15
资源大小:26k
文件大小:7k
源码类别:

Web服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "global.h"
  3. mytcp*th;
  4. int fla;
  5. int rrlen;
  6. int mytcp::mycreat(int port)
  7. {this->sum=2;
  8. this->rhead.len=0;
  9. rrlen=0;
  10. th=this;
  11. this->isreceve=0;
  12. rhead.len=0;
  13. start=&shead;
  14. //rhead=&rhead;
  15. return Create(port,SOCK_DGRAM);
  16. }
  17. int mytcp::myconnect(CString ip,int port)
  18. {
  19. this->isserve=0;
  20. node s;
  21. node *r=new node;
  22. s.synflag=0;
  23. s.senumber=160;
  24. mysyn=160;
  25. this->SendTo((void*)&s,sizeof(node),port,ip);
  26. int chaoshi=0;
  27. int j=0;
  28. for(;;)
  29. {
  30. chaoshi++;
  31. if(chaoshi>=30000)
  32. {chaoshi=0;
  33. j++;
  34. if(j>50000)
  35. {CString gg;
  36. gg.Format("connect超时%d",j);
  37. AfxMessageBox(gg);
  38. break;
  39. }
  40. }
  41. if(receive==1)
  42. {
  43. int ret=Receive(r,sizeof(node));
  44. receive=0;
  45. dsyn=r->senumber+1;
  46. if(r->acknumber!=mysyn+1)
  47. {CString ll;
  48. ll.Format("序列号错误%d,%d",r->acknumber,r->senumber);
  49. AfxMessageBox(ll);
  50. }
  51. else
  52. {AfxMessageBox("hahahah!");
  53. this->ip=ip;
  54. this->port=port;
  55. break;
  56. }}
  57. }
  58. this->isserve=1;
  59. this->mysyn++;
  60. this->dsyn=201;
  61. AfxMessageBox("cli连接成功");
  62. return 1;
  63. }
  64. void mytcp::OnReceive(int nErrorCode) 
  65. {
  66. if(nErrorCode==0)
  67. {
  68. receive=1;
  69. node s;
  70. if(th->isserve==1)
  71. {
  72. th->ReceiveFrom(&s,sizeof(node),th->ip,th->port);
  73. receive=0;
  74. }
  75. if((s.synflag==0)&&(th->isserve==1))//连接过程
  76. {
  77. dsyn=s.senumber+1;
  78. CString ll;
  79. ll.Format("serve:%d",s.senumber);
  80. //AfxMessageBox(ll);
  81. s.synflag=0;
  82. s.acknumber=s.senumber+1;
  83. s.senumber=200;
  84. th->mysyn=201;
  85. th->SendTo(&s,sizeof(node),th->port,th->ip);
  86. //this->isserve=0;
  87. //AfxMessageBox("serve连接成功");
  88. this->isaccpet=1;
  89. }
  90. if(s.synflag==1)
  91. {
  92. if(s.ackflag==1)//确认包?
  93. {
  94. node*p;
  95. p=start;
  96. if(start->senumber==s.acknumber)
  97. {  CString aa;
  98. aa.Format("se%d:len%d,npos:%d",s.acknumber,shead.len,start->npos);
  99. //AfxMessageBox(aa);
  100. if(start->npos>=shead.len)
  101. {CString hh;
  102. hh.Format("完成%d",s.acknumber);
  103. //AfxMessageBox(hh);
  104. th->isfinish=1;
  105. }
  106. else{
  107. start=p->next;
  108. }
  109. end=start;
  110. }
  111. }
  112. if(s.ackflag==0)//数据包
  113. {
  114. CString ss;
  115. s.data[s.pos]=0;
  116. ss.Format("data:%s:snumber%d dsn:%d",s.data,s.senumber,th->dsyn);
  117. node *p,*pre,*sl;
  118. pre=p=&rhead;
  119. //AfxMessageBox(ss);
  120. if(s.senumber==th->dsyn)
  121. {
  122. th->dsyn++;
  123. if(rhead.len==0)
  124. {
  125. p=pre->next=(node*)malloc(sizeof(node));
  126. rhead.len++;
  127. rrlen++;
  128. memcpy(p,&s,sizeof(node));
  129. p->life=8000;
  130. rend=p;
  131. rstart=&rhead;
  132. th->rstart=rstart;
  133. node ap;
  134. this->rlen=s.len;
  135. ap.ackflag=1;//回应数据
  136. ap.synflag=1;//非连接过程
  137. ap.acknumber=s.senumber;
  138. //AfxMessageBox("len=0");
  139. //AfxMessageBox("dsdsdsd");
  140. th->SendTo((char*)&ap,sizeof(node),th->port,th->ip);
  141. this->type=s.type;
  142. strcpy(this->name,s.name);
  143. if(rhead.len==s.len)
  144. {//AfxMessageBox("接受完毕");
  145. this->isreceve=1;
  146. }//AfxMessageBox("len=0");
  147. }
  148. //DWORD  dwthewad;
  149. //this->starttimer();
  150. //HANDLE thread=CreateThread(NULL,0,my2,this,0,&dwthewad);
  151. else 
  152. {//AfxMessageBox("len>0");
  153. sl=(node*)malloc(sizeof(node));
  154. memcpy(sl,&s,sizeof(node));
  155. sl->life=8000;
  156. node ackp;
  157. ackp.ackflag=1;//回应数据
  158. ackp.synflag=1;//非连接过程
  159. ackp.acknumber=sl->senumber;
  160. th->SendTo(&ackp,sizeof(node),th->port,th->ip);
  161. checkre(sl);
  162. if(rhead.len==this->rlen)
  163. {//AfxMessageBox(" 接受完毕");
  164. this->isreceve=1;
  165. }
  166. }
  167. }
  168. }
  169. }
  170. }
  171. }
  172. int mytcp::myaccept()
  173. {th->isserve=1;
  174. return 1;
  175. }
  176. /*int mytcp::mysend(char*buffer,int len)
  177. {int flag=0;
  178. node s,d;
  179. for(int i=0;i<len;i++)
  180. s.data[i]=buffer[i];
  181. s.senumber=this->mysyn+1;
  182. s.length=len;
  183. s.acknumber=this->dsyn;
  184. this->SendTo(&s,sizeof(node),this->port,this->ip);
  185. if(this->ReceiveFrom(&d,sizeof(node),this->ip,this->port)!=SOCKET_ERROR)
  186. {if(d.acknumber==this->dsyn)
  187. {
  188. flag=1;
  189. AfxMessageBox("发送成功");
  190. }
  191. }
  192. return flag;
  193. }*/
  194. int mytcp::mysend(char*buffer,int len)
  195. {
  196. int tempsum=0;
  197. if(th->setbuffer(&shead,buffer,len))
  198. {
  199. CString sa;
  200. sa.Format("创建成功%d",th->dsyn);
  201. //AfxMessageBox(sa);
  202. }
  203. node *p;
  204. start=shead.next;
  205. p=start;
  206. end=p;
  207. th->isfinish=0;
  208. th->starttimer();
  209. //for(;;)
  210. {
  211. }
  212. return 1;
  213. }
  214. DWORD mytcp::myreceive(char*buffer,DWORD len)
  215. {DWORD flag=0;
  216. if(rhead.len>0)
  217. {
  218. rhead.len=0;
  219. char *ps;
  220. ps=buffer;
  221. int ff;
  222. if(len%1024==0)
  223. ff=len/1024;
  224. else
  225. ff=(len/1024)+1;
  226. node*p;
  227. p=rhead.next;
  228. for(int i=0;i<ff;i++)
  229. {if(i>rhead.len)
  230. {
  231. rhead.len=0;
  232. break;
  233. }
  234. if(i==ff-1)
  235. {if(i==rhead.len)
  236. rhead.len=0;
  237. rhead.next=p->next;
  238. if((len%1024)==0)
  239. {
  240. memcpy(ps,p->data,p->pos);
  241. flag=flag+p->pos;
  242. }
  243. else
  244. {
  245. memcpy(ps,p->data,p->pos);
  246. flag=flag+p->pos;
  247. }
  248. }
  249. else
  250. {memcpy(ps,p->data,p->pos);
  251. flag=flag+p->pos;
  252. ps=ps+p->pos;
  253. p=p->next;
  254. }
  255. }}
  256. return flag;
  257. }
  258. DWORD WINAPI my(LPVOID param)
  259. {
  260. int  flag=0; 
  261. int j=0;
  262. for(;;)
  263. {
  264. if(th->isfinish==1)
  265. {CString kk;
  266. node *fre=&th->shead;
  267. node *pfre;
  268. pfre=fre;
  269. for(int fr=0;fr<th->shead.len;fr++)
  270. {  pfre=fre;
  271. fre=fre->next;
  272. if(pfre!=&th->shead)
  273. free(pfre);
  274. }
  275. kk.Format("chenggongfasongwanbi%d",th->dsyn);
  276. th->endofsend=1;
  277. //AfxMessageBox(kk);
  278. break;
  279. }
  280. // AfxMessageBox(ll);
  281. th->check(th->start);
  282. flag++;
  283. if(flag>=30000)
  284. {flag=0;
  285. node*p,*pre;
  286. p=th->start;
  287. if(th->shead.len!=0)
  288. {if(th->start==th->end)
  289. {
  290. if(th->start->issend==1)
  291. th->start->life--;
  292. if(th->start->life==0)
  293. AfxMessageBox("dead");
  294. }
  295. }
  296. }
  297. }
  298. return 1;
  299. }
  300. int mytcp::starttimer()
  301. {//th=this;
  302. DWORD  dwthewad;
  303. //eend=end;
  304. m_hThread=CreateThread(NULL,0,my,this,0,&dwthewad);
  305. return 1;
  306. }
  307. int mytcp::setbuffer(node*head,char*buffer,int len)
  308. {
  309. int flag=0;
  310. node*p,*pre;
  311. char *ps;
  312. ps=buffer;
  313. int aa=0;
  314. if(len%1024==0)
  315. aa=len/1024;
  316. else 
  317. aa=(len/1024)+1;
  318. shead.len=0;
  319. p=pre=head;
  320. head->len=0;
  321. for(int i=0;i<aa;i++)
  322. {p=pre->next=(node*)malloc(sizeof(node));
  323. if(i==0)
  324. {p->len=aa;
  325. p->type=this->type;
  326. strcpy(p->name,this->name);
  327. }
  328. head->len++;
  329. p->pos=0;
  330. if(p==head->next)
  331. {p->senumber=this->mysyn+i;
  332. p->npos=1;
  333. }
  334. else
  335. {p->senumber=pre->senumber+1;
  336. p->npos=pre->npos+1;
  337. }
  338. p->life=30000;
  339. p->synflag=1;
  340. p->issend=0;
  341. p->ackflag=0;
  342. p->resend=1;
  343. if(i==aa-1)
  344. {
  345. if(len%1024)
  346. {p->pos=len%1024;
  347. memcpy(p->data,ps,len%1024);
  348. flag=1;
  349. }
  350. else
  351. {
  352. p->pos=1024;
  353. memcpy(p->data,ps,1024);
  354. flag=1;
  355. }
  356. }
  357. else
  358. {p->pos=1024;
  359. memcpy(p->data,ps,1024);
  360. ps=ps+1024;
  361. }
  362. pre=p;
  363. }
  364. this->mysyn=p->senumber+1;
  365. return flag;
  366. }
  367. int mytcp::check(node*p)
  368. {int flag=1;
  369. if((p->issend==1)&&(p->life<=0))
  370. {AfxMessageBox("send 2");
  371. this->SendTo(p,sizeof(node),this->port,this->ip);
  372. p->resend++;
  373. if(p->resend>=3)
  374. {
  375. AfxMessageBox("网络不通?");
  376. flag=0;
  377. }
  378. }
  379. if(p->issend==0)
  380. {
  381. //AfxMessageBox("fasong1");
  382. this->SendTo(p,sizeof(node),this->port,this->ip);
  383. p->resend=0;
  384. p->issend=1;
  385. }
  386. return flag;
  387. }
  388. int mytcp::checkre(node*p)
  389. {
  390. node*pp,*pre;
  391. pre=pp=&rhead;
  392. int flag=0;
  393. for(int i=0;i<rhead.len;i++)
  394. {pp=pp->next;
  395. if(p->senumber<pp->senumber)
  396. {rhead.len++;
  397. rrlen++;
  398. pre->next=p;
  399. p->next=pp;
  400. }
  401. /*if(p->senumber==pp->senumber)
  402. {flag=1;
  403. break;
  404. }*/
  405. pre=pp;
  406. }
  407. if((i==rhead.len)&&(flag!=1))
  408. {pp->next=p;
  409. rhead.len++;
  410. rrlen++;
  411. }
  412. return 1;
  413. }