Beispiel #1
0
        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);
        }
Beispiel #2
0
        public static int onPublicKeySent(IntPtr handle, FSP_ServiceCode code, int result)
        {
            Console.WriteLine("onPublicKeySent: Handle = {0:X}, code = {1}, result = {2}", handle, code, result);
            if (result < 0)
            {
                FSPAPI.Dispose(handle);
                finished = true;
                return(-1);
            }

            Console.Write("To read the filename directly...\t");
            if (FSPAPI.ReadFrom(handle, fileName, fileName.Length, new NotifyOrReturn(onReceiveFileNameReturn)) < 0)
            {
                FSPAPI.Dispose(handle);
                finished = true;
                return(-1);
            }

            return(0);
        }