inThread.cpp
上传用户:heseme
上传日期:2009-12-23
资源大小:228k
文件大小:3k
开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "FireWall1.h"
  3. #include "outnat.h"
  4. #include "authentication.h"
  5. /////////////////////////////////////
  6. /*
  7. 本程序从网卡1读入栈(TCP/IP栈)数据,
  8. 放入tempdata[480][1600]。
  9. 并把tempdata COPY到公共缓冲区global[68]的Buffer。
  10. global_var global[68]见"testddk.h"
  11. 用到两种类型变量控制县城同步,
  12. 其中global_mutex是一个mutex,
  13. 用于控制global[]的下标global_cur。
  14. global[].hMutex是一组Event,
  15. 用于控制缓冲区。
  16. */
  17. ////////////////////////////////////////
  18. extern BOOL CloseAll;
  19. global_var global[80];//全局管理数据
  20. int global_cur;
  21. extern int Resno;//恢复县城
  22. HANDLE global_mutex;//控制global_cur
  23. extern HANDLE mythread_write;
  24. BOOL OPER;
  25. BOOL write;   
  26. BYTE tempdata[480][1600];//网卡1入栈数据包
  27. //extern BYTE  SpecialBuffer[1500];
  28. BOOL  ACK = 0;
  29. static OVERLAPPED   OverLappedread_in,*lpOverLappedread;
  30. static int defer;
  31. extern HANDLE global_handle,global_handle1;
  32. OVERLAPPED myoverlap;
  33. static int off;
  34. static int count40;
  35. static int count = 0;
  36. static int mydata;
  37. extern HANDLE mythread_in;
  38. static int aaa=0;
  39. static int bbb=0;
  40. VOID WINAPI ReadCompletionRoutine(DWORD dwErrorCode, 
  41.    DWORD dwNumberOfBytesTransferred, 
  42.    LPOVERLAPPED pOverlapped);
  43. void initdata_in();
  44. void ReadInBuffer();
  45. static int inittime_in=0;
  46. VOID ReadInThread(VOID)
  47. {
  48. if(inittime_in++==0) initdata_in();
  49. while(!CloseAll)//洗垢函数通知
  50. {
  51. if((off>=235)&&(mydata<190))
  52. {
  53. // continue;
  54. }
  55. if(count40==60)//45*1518>65535,这样才能大数据包有效
  56. {
  57.   aaa++;
  58. SleepEx(1,TRUE);
  59. continue;
  60. }
  61. else count40++;
  62. if(off>79)off=0;
  63. ReadInBuffer();
  64. }
  65. //   TRACE(_T("INTHREAD FINISHn"));
  66. }
  67. VOID WINAPI ReadCompletionRoutine(DWORD dwErrorCode, 
  68.    DWORD dwNumberOfBytesTransferred, 
  69.    LPOVERLAPPED pOverlapped) {
  70. if(OPER)
  71. {
  72. if(mydata>79)
  73. {
  74. bbb++;
  75. mydata=0;
  76. }
  77. DWORD dw=WaitForSingleObject(global_mutex,INFINITE);
  78. if(dw==WAIT_OBJECT_0)
  79. {
  80. BOOL fdone=FALSE;
  81. {
  82. {
  83. memcpy(global[global_cur].Buffer,
  84. tempdata[mydata],
  85. 1518);
  86. global[global_cur].overlap=*pOverlapped;
  87. SetEvent(global[global_cur].hMutex);
  88. global_cur++;
  89. if(global_cur>79)global_cur=0;
  90. ReleaseMutex(global_mutex);
  91. fdone=TRUE;
  92. mydata++;
  93. count40--;
  94. // count40=0;
  95. }
  96. }
  97. if(dwErrorCode!= 0)
  98. {
  99. //   TRACE(_T("I/O ERR IN READCOMPn"));
  100. return;
  101. }
  102. }
  103. }
  104. }
  105. void ReadInBuffer()
  106. {
  107. BOOL Result;
  108. memset(&OverLappedread_in,0,sizeof(OVERLAPPED));
  109. lpOverLappedread=&OverLappedread_in;
  110. Result=ReadFileEx(
  111. global_handle,
  112. tempdata[off],
  113. 1520,
  114. lpOverLappedread,
  115. ReadCompletionRoutine);
  116. if (Result==0)
  117. {
  118. int ii=GetLastError();
  119. OPER=FALSE;
  120. // if((ii==1450)||(ii==998))
  121. TRACE(_T("不通n"));
  122. }
  123. else
  124. {
  125. off++;
  126. OPER=TRUE;
  127. }
  128. }
  129. void initdata_in()
  130. {
  131. mydata=0;
  132. defer=0;
  133. count40=0;
  134. off=0;         
  135. global_cur=0;
  136. global_mutex=CreateMutex(NULL,0,NULL);
  137. for(int aa=0;aa<480;aa++)
  138. {   
  139. memset(tempdata[aa],0,1600);
  140. }
  141. for(int i=0;i<80;i++)
  142. {
  143. memset(&global[i],0,sizeof(global_var));
  144. global[i].hMutex =CreateEvent(0,0,0,0);
  145. }
  146. memset(&myoverlap,0,sizeof(myoverlap));
  147. OPER=FALSE;
  148. }