fork download
  1. public void WorkerThread()
  2. {
  3. while (Wait() != -1)
  4. {
  5. // Infinite loop
  6. }
  7. }
  8.  
  9. // return value
  10. // 0 = disconnect or others
  11. // 1 = recv
  12. // 2 = send
  13. public int Wait()
  14. {
  15. PerHandleData perHandleData;
  16. PerIoData perIoData;
  17. Overlapped overlapped;
  18. IntPtr intPtrPerHandleData;
  19. IntPtr intPtrOverlapped;
  20. uint bytesTransferred;
  21.  
  22.  
  23. // Wait until all socket I/O completes.
  24. bool ret = Win32Api.GetQueuedCompletionStatus(
  25. completionPort: completionPort,
  26. lpNumberOfBytesTransferred: out bytesTransferred,
  27. lpCompletionKey: out intPtrPerHandleData,
  28. lpOverlapped: out intPtrOverlapped,
  29. dwMilliseconds: uint.MaxValue);
  30.  
  31. Console.WriteLine("Get queued completion status");
  32.  
  33. // Problem during overlapped I/O.
  34. if (intPtrOverlapped == IntPtr.Zero)
  35. {
  36. Logger.ErrorLog();
  37. // Reset();
  38. return -1;
  39. }
  40.  
  41. // Recover PerIoData and PerHandleData from IntPtr
  42. GCHandle gchPerHandleData = GCHandle.FromIntPtr(intPtrPerHandleData);
  43. perHandleData = (PerHandleData)gchPerHandleData.Target;
  44. overlapped = new Overlapped();
  45. Marshal.PtrToStructure(intPtrOverlapped, overlapped);
  46. GCHandle gchPerIoData = GCHandle.FromIntPtr(overlapped.PerIoDataPtr);
  47. perIoData = (PerIoData)gchPerIoData.Target;
  48.  
  49. // When socket is disconnected, there is no transferred data.
  50. // Release resources and close the socket.
  51. if (bytesTransferred == 0 && ret == false)
  52. {
  53. Logger.ErrorLog();
  54. Console.WriteLine("disconnected from socket: "
  55. + perHandleData.Socket.GetHashCode());
  56. DisconnectCallBack(perHandleData.Socket);
  57.  
  58. socketRefCount[perHandleData.Socket] =
  59. (int)socketRefCount[perHandleData.Socket] - 1;
  60. if ((int) socketRefCount[perHandleData.Socket] == 0)
  61. {
  62. socketRefCount.Remove(perHandleData.Socket);
  63. perHandleData.Socket.Close();
  64. }
  65. gchPerHandleData.Free();
  66. gchPerIoData.Free();
  67. return 0;
  68. }
  69.  
  70. // When receive done, invoke call back function
  71. // and release resources of per I/O data.
  72. else if (perIoData.State == OperationState.Receive)
  73. {
  74. byte[] buffer = new byte[bytesTransferred];
  75. Array.Copy(perIoData.Buffer, buffer, bytesTransferred);
  76. String data = Encoding.UTF8.GetString(buffer);
  77.  
  78. Console.WriteLine("received from socket: " +
  79. perHandleData.Socket.GetHashCode());
  80. ReceiveCallBack(perHandleData.Socket, data);
  81.  
  82. // Decrement reference count to the socket.
  83. socketRefCount[perHandleData.Socket] =
  84. (int)socketRefCount[perHandleData.Socket] - 1;
  85.  
  86. gchPerIoData.Free();
  87. return 1;
  88. }
  89.  
  90. // When send done, release resources of per I/O data.
  91. // If sending was partial, send remaining data.
  92. else
  93. {
  94. if (perIoData.WSABuffer.Length != bytesTransferred)
  95. {
  96. byte[] dataBytes = new byte[perIoData.WSABuffer.Length -
  97. bytesTransferred];
  98. Array.Copy(perIoData.Buffer, bytesTransferred, dataBytes, 0,
  99. dataBytes.Length);
  100. Send(perHandleData.Socket, dataBytes);
  101.  
  102. // Decrement reference count to the socket.
  103. socketRefCount[perHandleData.Socket] =
  104. (int)socketRefCount[perHandleData.Socket] - 1;
  105. }
  106. else
  107. {
  108. Console.WriteLine("sent to socket: " +
  109. perHandleData.Socket.GetHashCode());
  110. SendCallBack(perHandleData.Socket);
  111.  
  112. // Decrement reference count to the socket.
  113. socketRefCount[perHandleData.Socket] =
  114. (int)socketRefCount[perHandleData.Socket] - 1;
  115.  
  116. gchPerIoData.Free();
  117. }
  118. return 2;
  119. }
  120. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cs(1,7): error CS1525: Unexpected symbol `void', expecting `class', `delegate', `enum', `interface', `partial', or `struct'
prog.cs(13,23): error CS1525: Unexpected symbol `int', expecting `class', `delegate', `enum', `interface', `partial', or `struct'
prog.cs(44,38): error CS1530: Keyword `new' is not allowed on namespace elements
prog.cs(44,41): error CS1525: Unexpected symbol `Overlapped', expecting `class', `delegate', `enum', `interface', `partial', or `struct'
prog.cs(58,69): error CS1525: Unexpected symbol `='
prog.cs(59,82): error CS1525: Unexpected symbol `-'
prog.cs(60,79): error CS1525: Unexpected symbol `=='
prog.cs(74,37): warning CS0658: `]' is invalid attribute target. All attributes in this attribute section will be ignored
prog.cs(120,17): error CS8025: Parsing error
Compilation failed: 8 error(s), 1 warnings
stdout
Standard output is empty