Example #1
0
        /// <summary>
        /// 名称:发送小文件 描述:向指定连接发送 4096 KB 以下的小文件
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <param name="head">头部附加数据,可以为null</param>
        /// <param name="tail">尾部附加数据,可以为null</param>
        /// <returns>TRUE.成功,FALSE.失败,可通过 SYSGetLastError() 获取 Windows 错误代码</returns>
        public bool SendSmallFile(string filePath, byte[] head, byte[] tail)
        {
            IntPtr pHead   = IntPtr.Zero;
            IntPtr pTail   = IntPtr.Zero;
            WSABUF wsaHead = new WSABUF()
            {
                Length = 0, Buffer = pHead
            };
            WSABUF wsatail = new WSABUF()
            {
                Length = 0, Buffer = pTail
            };

            if (head != null)
            {
                wsaHead.Length = head.Length;
                wsaHead.Buffer = Marshal.UnsafeAddrOfPinnedArrayElement(head, 0);
            }

            if (tail != null)
            {
                wsaHead.Length = tail.Length;
                wsaHead.Buffer = Marshal.UnsafeAddrOfPinnedArrayElement(tail, 0);
            }

            return(SendSmallFile(filePath, ref wsaHead, ref wsatail));
        }
		private static int Receive_internal (IntPtr sock,
		WSABUF[] bufarray,
		SocketFlags flags,
		out int error)
		{
			throw new System.NotImplementedException();
		}
Example #3
0
 public static unsafe extern int WSARecv(
     IntPtr s,
     ref WSABUF lpBuffers,
     UInt32 dwBufferCount,
     out UInt32 lpNumberOfBytesRecvd,
     ref SocketFlags lpFlags,
     NativeOverlapped* lpOverlapped,
     CompletionROUTINE lpCompletionRoutine);
        /// <summary>
        /// 发送多组数据
        /// 向指定连接发送多组数据
        /// TCP - 顺序发送所有数据包
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="connId">连接id</param>
        /// <param name="objects">发送的数据</param>
        /// <returns>TRUE.成功,FALSE.失败,可通过 SYSGetLastError() 获取 Windows 错误代码</returns>
        public bool SendPackets <T>(IntPtr connId, T[] objects)
        {
            bool ret = false;

            WSABUF[] buffer = new WSABUF[objects.Length];
            IntPtr[] ptrs   = new IntPtr[buffer.Length];
            try
            {
                for (int i = 0; i < objects.Length; i++)
                {
                    buffer[i].Length = Marshal.SizeOf(typeof(T));

                    ptrs[i] = Marshal.AllocHGlobal(buffer[i].Length);
                    Marshal.StructureToPtr(objects[i], ptrs[i], true);

                    buffer[i].Buffer = ptrs[i];
                }

                ret = SendPackets(connId, buffer, buffer.Length);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                for (int i = 0; i < ptrs.Length; i++)
                {
                    if (ptrs[i] != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(ptrs[i]);
                    }
                }
            }

            return(ret);
        }
Example #5
0
		int Send (IList<ArraySegment<byte>> buffers, SocketFlags socketFlags, out SocketError errorCode)
		{
			if (disposed && closed)
				throw new ObjectDisposedException (GetType ().ToString ());
			if (buffers == null)
				throw new ArgumentNullException ("buffers");
			if (buffers.Count == 0)
				throw new ArgumentException ("Buffer is empty", "buffers");
			int numsegments = buffers.Count;
			int nativeError;
			int ret;

			WSABUF[] bufarray = new WSABUF[numsegments];
			GCHandle[] gch = new GCHandle[numsegments];
			for(int i = 0; i < numsegments; i++) {
				ArraySegment<byte> segment = buffers[i];
				gch[i] = GCHandle.Alloc (segment.Array, GCHandleType.Pinned);
				bufarray[i].len = segment.Count;
				bufarray[i].buf = Marshal.UnsafeAddrOfPinnedArrayElement (segment.Array, segment.Offset);
			}

			try {
				ret = Send_internal (socket, bufarray, socketFlags, out nativeError);
			} finally {
				for(int i = 0; i < numsegments; i++) {
					if (gch[i].IsAllocated) {
						gch[i].Free ();
					}
				}
			}
			errorCode = (SocketError)nativeError;
			return(ret);
		}
Example #6
0
		private extern static int Receive_internal (IntPtr sock, WSABUF[] bufarray, SocketFlags flags, out int error);
Example #7
0
 public static extern bool HP_Agent_SendPackets(IntPtr pAgent, IntPtr connId, WSABUF[] pBuffers, int iCount);
Example #8
0
 public static extern bool HP_TcpServer_SendSmallFile(IntPtr pServer, IntPtr connId, string lpszFileName, ref WSABUF pHead, ref WSABUF pTail);
Example #9
0
		extern static int Send_internal (IntPtr sock, WSABUF[] bufarray, SocketFlags flags, out int error);
Example #10
0
		public int Send (IList<ArraySegment<byte>> buffers, SocketFlags socketFlags, out SocketError errorCode)
		{
			ThrowIfDisposedAndClosed ();

			if (buffers == null)
				throw new ArgumentNullException ("buffers");
			if (buffers.Count == 0)
				throw new ArgumentException ("Buffer is empty", "buffers");

			int numsegments = buffers.Count;
			int nativeError;
			int ret;

			WSABUF[] bufarray = new WSABUF[numsegments];
			GCHandle[] gch = new GCHandle[numsegments];

			for(int i = 0; i < numsegments; i++) {
				ArraySegment<byte> segment = buffers[i];

				if (segment.Offset < 0 || segment.Count < 0 || segment.Count > segment.Array.Length - segment.Offset)
					throw new ArgumentOutOfRangeException ("segment");

				gch[i] = GCHandle.Alloc (segment.Array, GCHandleType.Pinned);
				bufarray[i].len = segment.Count;
				bufarray[i].buf = Marshal.UnsafeAddrOfPinnedArrayElement (segment.Array, segment.Offset);
			}

			try {
				ret = Send_internal (safe_handle, bufarray, socketFlags, out nativeError);
			} finally {
				for(int i = 0; i < numsegments; i++) {
					if (gch[i].IsAllocated) {
						gch[i].Free ();
					}
				}
			}

			errorCode = (SocketError)nativeError;

			return ret;
		}
Example #11
0
 /// <summary>
 /// 名称:发送小文件
 /// 描述:向指定连接发送 4096 KB 以下的小文件
 /// </summary>
 /// <param name="filePath">文件路径</param>
 /// <param name="head">头部附加数据</param>
 /// <param name="tail">尾部附加数据</param>
 /// <returns>TRUE.成功,FALSE.失败,可通过 SYSGetLastError() 获取 Windows 错误代码</returns>
 public bool SendSmallFile(string filePath, ref WSABUF head, ref WSABUF tail)
 {
     return(HPSocketSdk.HP_TcpClient_SendSmallFile(pClient, filePath, ref head, ref tail));
 }
Example #12
0
        static void Main(string[] args)
        {
            var nancyApp = StartupNancyApp();

            //var workingTitleApp = StartupWorkingTitleApp();

            for (;;)
            {
                var input = Console.ReadLine();
                if (input == "exit")
                {
                    nancyApp.Dispose();
                    //workingTitleApp.Dispose();
                    return;
                }

                if (input == "1")
                {
                    var request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:8080");
                    try
                    {
                        request.GetResponse();
                    }
                    catch (WebException ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                else if (input == "2")
                {
                    var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                    socket.Connect("localhost", 8080);
                    var blocking = socket.Blocking;
                    socket.Blocking = false;
                    //var sr = socket.BeginReceive(new byte[0], 0, 0, SocketFlags.None, ar =>
                    //                                                                      {
                    //                                                                          socket.EndReceive(ar);
                    //                                                                      }, null);

                    //var optionOutValue = new byte[4];
                    //var ioControl = socket.IOControl(IOControlCode.NonBlockingIO, new byte[] {1, 0, 0, 0}, optionOutValue);
                    unsafe
                    {
                        var wsabuf = new WSABUF();
                        uint numberOfBytesRecvd;
                        var flags = SocketFlags.None;
                        var result = WSARecv(
                            socket.Handle, ref wsabuf, 1, out numberOfBytesRecvd, ref flags, null, CallbackThunk1);

                        var lastError = result == -1 ? Marshal.GetLastWin32Error() : 0;

                        var overlapped = new Overlapped();
                        overlapped.AsyncResult = new ARes();
                        var nativeOverlapped = overlapped.Pack(Iocb, null);
                        Trace.WriteLine(string.Format("{0}", new IntPtr(nativeOverlapped)));

                        wsabuf = new WSABUF {buf = Marshal.AllocCoTaskMem(512), len = 512};
                        var result2 = WSARecv2(
                            socket.Handle,
                            ref wsabuf,
                            1,
                            out numberOfBytesRecvd,
                            ref flags,
                            nativeOverlapped,
                            IntPtr.Zero);
                        var lastError2 = result2 == -1 ? Marshal.GetLastWin32Error() : 0;

                        var data = @"GET / HTTP/1.1
            Host: localhost
            Connection: close

            ".ToArraySegment();
                        SocketError err;
                        socket.BeginSend(
                            data.Array,
                            data.Offset,
                            data.Count,
                            SocketFlags.None,
                            out err,
                            ar =>
                            {
                                socket.EndSend(ar);
                                socket.Shutdown(SocketShutdown.Send);
                            },
                            null);
                    }
                }
                else
                {
                    Console.WriteLine("Known input. Enter exit to exit.");
                }
            }
        }
Example #13
0
		extern static int Receive_internal (IntPtr sock, WSABUF[] bufarray, SocketFlags flags, out int error, bool blocking);
Example #14
0
 /// <summary>
 /// 名称:发送小文件
 /// 描述:向指定连接发送 4096 KB 以下的小文件
 /// </summary>
 /// <param name="connId"></param>
 /// <param name="filePath">文件路径</param>
 /// <param name="head">头部附加数据</param>
 /// <param name="tail">尾部附加数据</param>
 /// <returns>TRUE.成功,FALSE.失败,可通过 SYSGetLastError() 获取 Windows 错误代码</returns>
 public bool SendSmallFile(IntPtr connId, string filePath, ref WSABUF head, ref WSABUF tail)
 {
     return(HPSocketSdk.HP_TcpServer_SendSmallFile(pServer, connId, filePath, ref head, ref tail));
 }
Example #15
0
		public int Receive (IList<ArraySegment<byte>> buffers, SocketFlags socketFlags, out SocketError errorCode)
		{
			ThrowIfDisposedAndClosed ();

			if (buffers == null || buffers.Count == 0)
				throw new ArgumentNullException ("buffers");

			int numsegments = buffers.Count;
			int nativeError;
			int ret;

			/* Only example I can find of sending a byte array reference directly into an internal
			 * call is in System.Runtime.Remoting/System.Runtime.Remoting.Channels.Ipc.Win32/NamedPipeSocket.cs,
			 * so taking a lead from that... */
			WSABUF[] bufarray = new WSABUF[numsegments];
			GCHandle[] gch = new GCHandle[numsegments];

			for (int i = 0; i < numsegments; i++) {
				ArraySegment<byte> segment = buffers[i];

				if (segment.Offset < 0 || segment.Count < 0 || segment.Count > segment.Array.Length - segment.Offset)
					throw new ArgumentOutOfRangeException ("segment");

				gch[i] = GCHandle.Alloc (segment.Array, GCHandleType.Pinned);
				bufarray[i].len = segment.Count;
				bufarray[i].buf = Marshal.UnsafeAddrOfPinnedArrayElement (segment.Array, segment.Offset);
			}

			try {
				ret = Receive_internal (safe_handle, bufarray, socketFlags, out nativeError);
			} finally {
				for (int i = 0; i < numsegments; i++) {
					if (gch[i].IsAllocated)
						gch[i].Free ();
				}
			}

			errorCode = (SocketError) nativeError;

			return ret;
		}
Example #16
0
		static int Receive_internal (SafeSocketHandle safeHandle, WSABUF[] bufarray, SocketFlags flags, out int error)
		{
			try {
				safeHandle.RegisterForBlockingSyscall ();
				return Receive_internal (safeHandle.DangerousGetHandle (), bufarray, flags, out error);
			} finally {
				safeHandle.UnRegisterForBlockingSyscall ();
			}
		}
Example #17
0
 public static extern bool HP_Client_SendPackets(IntPtr pClient, WSABUF[] pBuffers, int iCount);
Example #18
0
		static int Send_internal (SafeSocketHandle safeHandle, WSABUF[] bufarray, SocketFlags flags, out int error)
		{
			bool release = false;
			try {
				safeHandle.DangerousAddRef (ref release);
				return Send_internal (safeHandle.DangerousGetHandle (), bufarray, flags, out error);
			} finally {
				if (release)
					safeHandle.DangerousRelease ();
			}
		}
Example #19
0
 public static extern bool HP_Server_SendPackets(IntPtr pServer, IntPtr connId, WSABUF[] pBuffers, int iCount);
Example #20
0
 /// <summary>
 /// 名称:发送小文件
 /// 描述:向指定连接发送 4096 KB 以下的小文件
 /// </summary>
 /// <param name="connId"></param>
 /// <param name="filePath">文件路径</param>
 /// <param name="head">头部附加数据</param>
 /// <param name="tail">尾部附加数据</param>
 /// <returns>TRUE.成功,FALSE.失败,可通过 SYSGetLastError() 获取 Windows 错误代码</returns>
 public bool SendSmallFile(IntPtr connId, string filePath, ref WSABUF head, ref WSABUF tail)
 {
     return(Sdk.HP_TcpAgent_SendSmallFile(pAgent, connId, filePath, ref head, ref tail));
 }
Example #21
0
 public static extern bool HP_TcpClient_SendSmallFile(IntPtr pClient, string lpszFileName, ref WSABUF pHead, ref WSABUF pTail);