public static int onConnected(IntPtr handle, ref FSP_SocketParameter context) { Console.WriteLine("Connected, handle = {0:X}", handle); if (handle == (IntPtr)0) { Console.WriteLine("Connection failed."); return(-1); } if (context.len <= 0) { goto l_nokey; } // well, how to marshal a complicate, mixed string and byte array? byte[] original = new byte[1024]; Marshal.Copy(context.welcome, original, 0, context.len); // we knew there must be a welcome message. int mLen = Array.IndexOf <byte>(original, 0); if (mLen++ <= 0) { goto l_nokey; } // Now mLen is the number of bytes occupied by the message, including the termination '\0' Console.WriteLine("--- Welcome message from remote peer --- "); Console.WriteLine(">>>"); Console.WriteLine(Encoding.UTF8.GetString(original, 0, mLen)); //TODO! .GetEncoding("GBK")? ASCII!? Console.WriteLine("<<<"); if (mLen >= context.len) { goto l_nokey; } Array.Copy(original, mLen, bufPeersKey, 0, FSPAPI.CRYPTO_NACL_KEYBYTES); FSPAPI.InstallAuthenticKey(handle, bufSharedKey, FSPAPI.CRYPTO_NACL_KEYBYTES, Int32.MaxValue, FlagEndOfMessage.NOT_END_ANYWAY); FSPAPI.FSPControl(handle , FSP_ControlCode.FSP_SET_CALLBACK_ON_ERROR , Marshal.GetFunctionPointerForDelegate(new NotifyOrReturn(onError2))); FSPAPI.WriteTo(handle, bufPublicKey, FSPAPI.CRYPTO_NACL_KEYBYTES , FlagEndOfMessage.END_OF_MESSAGE , new NotifyOrReturn(onPublicKeySent)); return(0); l_nokey: Console.Write("To read the filename directly...\t"); if (FSPAPI.ReadFrom(handle, fileName, fileName.Length, new NotifyOrReturn(onReceiveFileNameReturn)) < 0) { finished = true; return(-1); // to dispose/reject the connection } return(0); }
public static int onReceiveNextBlock(IntPtr handle , [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] Byte[] buf, int len, bool toBeContinued) { if (len < 0) { Console.WriteLine("FSP Internal panic? Callback on peeked return {0}", len); FSPAPI.Dispose(handle); finished = true; return(-1); } if (len > 0) { Console.Write("{0} bytes read, to write the buffer directly...", len); try { hFile.Write(buf, 0, len); Console.WriteLine("done."); } catch (Exception e) { Console.WriteLine("Error on writing file: {0}", e.Message); FSPAPI.Dispose(handle); finished = true; return(-1); } } else { Console.WriteLine("Receive nothing when calling the CallbackPeeked."); } if (!toBeContinued) { Console.WriteLine("All data have been received, to acknowledge...\n"); hFile.Close(); // Respond with a code saying no error int r = FSPAPI.WriteTo(handle, Encoding.ASCII.GetBytes("0000"), 4, FlagEndOfMessage.END_OF_MESSAGE, new NotifyOrReturn(onAcknowledgeSent)); if (r < 0) { FSPAPI.Dispose(handle); finished = true; return(-1); } } // return a non-zero would let the occupied receive buffer free return(1); }