/// <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(); }
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); }
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); }
private extern static int Receive_internal (IntPtr sock, WSABUF[] bufarray, SocketFlags flags, out int error);
public static extern bool HP_Agent_SendPackets(IntPtr pAgent, IntPtr connId, WSABUF[] pBuffers, int iCount);
public static extern bool HP_TcpServer_SendSmallFile(IntPtr pServer, IntPtr connId, string lpszFileName, ref WSABUF pHead, ref WSABUF pTail);
extern static int Send_internal (IntPtr sock, WSABUF[] bufarray, SocketFlags flags, out int error);
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; }
/// <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)); }
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."); } } }
extern static int Receive_internal (IntPtr sock, WSABUF[] bufarray, SocketFlags flags, out int error, bool blocking);
/// <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)); }
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; }
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 (); } }
public static extern bool HP_Client_SendPackets(IntPtr pClient, WSABUF[] pBuffers, int iCount);
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 (); } }
public static extern bool HP_Server_SendPackets(IntPtr pServer, IntPtr connId, WSABUF[] pBuffers, int iCount);
/// <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)); }
public static extern bool HP_TcpClient_SendSmallFile(IntPtr pClient, string lpszFileName, ref WSABUF pHead, ref WSABUF pTail);