Thread.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. 放入tempdataout[480][1600]。
  9. 并把tempdataout 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. extern BOOL Out_IOCancel;
  20. extern BOOL In_IOCancel;//在这里也需要
  21. extern global_var global[80];
  22. static offout;
  23. static mydataout;
  24. static count40out;
  25. static int countout;
  26. static int deferout;
  27. static int count1out;
  28. BOOL writeout;
  29. extern BOOL exeThread[480];
  30. void ReadOutBuffer();
  31. static BYTE tempdataout[480][1600];
  32. extern HANDLE global_handle;
  33. extern BYTE SourceIPFlag[4096];
  34. BOOL OPEROUT;
  35. static OVERLAPPED   OverLappedread_out,*lpOverLappedreadout;
  36. extern HANDLE mythread_out;
  37. extern BOOL ACK;
  38. extern int global_cur;
  39. extern HANDLE global_mutex;
  40. extern HANDLE fin_out1thread_mutex;
  41. //BYTE SpecialBuffer[1500];
  42. extern HANDLE mythread_write;
  43. extern int Resno;//恢复县城
  44. VOID WINAPI OutReadCompletionRoutine(DWORD dwErrorCode, 
  45.    DWORD dwNumberOfBytesTransferred, 
  46.    LPOVERLAPPED pOverlapped);
  47. void initdata_out();
  48. static int inittime_out=0;
  49. static int timecount;
  50. VOID ReadOutThread(VOID){
  51. if(inittime_out++==0) initdata_out();
  52. Sleep(1);//我认为出来包比入包应该慢一点
  53. while(!CloseAll)//洗垢函数通知
  54. {
  55. {
  56. if((offout>=235)&&(mydataout<190))
  57. {
  58. // continue;
  59. }
  60. if(count40out==60)
  61. {
  62. SleepEx(1,TRUE);
  63. continue;
  64. }
  65. else count40out++;
  66. if(offout>479)offout=0;
  67. ReadOutBuffer();
  68. }
  69. }
  70. // TRACE(_T("OUT THREAD FINISH_BEGINn"));
  71. }  
  72. void ReadOutBuffer()
  73. {
  74. BOOL Result;  
  75. memset(&OverLappedread_out,0,sizeof(OVERLAPPED));
  76. lpOverLappedreadout=&OverLappedread_out;
  77. Result=ReadFileEx(
  78. global_handle,
  79. tempdataout[offout],
  80. 1520,
  81. lpOverLappedreadout,
  82. OutReadCompletionRoutine);
  83. if (Result==0)
  84. {
  85. int ii=GetLastError();
  86. OPEROUT=FALSE;
  87. TRACE(_T("不通n"));
  88. }
  89. else
  90. {
  91. offout++;   
  92. OPEROUT=TRUE;
  93. }
  94. }
  95. VOID WINAPI OutReadCompletionRoutine(DWORD dwErrorCode, 
  96.    DWORD dwNumberOfBytesTransferred, 
  97.    LPOVERLAPPED pOverlapped) {
  98. if(OPEROUT)
  99. {
  100. if(mydataout>479)mydataout=0;
  101. countout++;
  102. DWORD dw=WaitForSingleObject(global_mutex,INFINITE);
  103. if(dw==WAIT_OBJECT_0)
  104. {
  105. BOOL fdoneout=FALSE;
  106. {
  107. memcpy(global[global_cur].Buffer,
  108. tempdataout[mydataout],
  109. 1518);
  110. fdoneout=TRUE;
  111. global[global_cur].overlap=*pOverlapped;
  112. SetEvent(global[global_cur].hMutex);
  113. global_cur++;
  114. if(global_cur>79)global_cur=0;
  115. ReleaseMutex(global_mutex);
  116. count40out--;
  117. // count40out=0;
  118. mydataout++;
  119. }
  120. }
  121. }
  122. if(dwErrorCode!= 0)
  123. {
  124. // TRACE(_T("I/O ERR OUT READCOMPn"));
  125.     return;
  126. }
  127. }
  128. void initdata_out()
  129. {
  130. mydataout=0;
  131. deferout=0;
  132. count40out=0;
  133. offout=0;
  134. count1out=0;
  135. timecount=0;
  136. OPEROUT=FALSE;
  137. memset(&OverLappedread_out,0,sizeof(OVERLAPPED));
  138. for(int aa=0;aa<480;aa++)
  139. {
  140. memset(tempdataout[aa],0,1600);
  141. tempdataout[aa][0]=1;
  142. }
  143. }