2014-02-22 27 views
1

这里WSASend是我的代码,我有没有成功:调用从C#

Unmanaged.WsaBuf buffer = 
    Unmanaged.WsaBuf.Create("Blah Blah"); 

IntPtr bufferPointer = Marshal.AllocHGlobal(Marshal.SizeOf(buffer)); 
Marshal.StructureToPtr(buffer, bufferPointer, true); 

IntPtr o; 
SocketError error = Unmanaged.WSA_Send(
    socket, 
    bufferPointer, 
    1, 
    out o, 
    SocketFlags.None, 
    IntPtr.Zero, 
    IntPtr.Zero); 

这里是方法声明:

[DllImport("Ws2_32.dll", SetLastError = true, EntryPoint = "WSASend")] 
    public static extern SocketError WSA_Send(IntPtr socket, IntPtr buffer, int len, out IntPtr numberOfBytesSent, SocketFlags flags, IntPtr overlapped, IntPtr completionRoutine); 

这是我WSABUF声明:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct WsaBuf 
{ 
    public ulong Len; 

    public IntPtr Buf; 

    public static WsaBuf Create(string str) 
    { 
     byte[] connectBuf = Encoding.ASCII.GetBytes(str); 
     GCHandle pinnedArray = GCHandle.Alloc(connectBuf, GCHandleType.Pinned); 
     return new WsaBuf { Buf = pinnedArray.AddrOfPinnedObject(), Len = (ulong)connectBuf.Length }; 
    } 

    public void Free() 
    { 
     if (!Buf.Equals(IntPtr.Zero)) 
     { 
      GCHandle.FromIntPtr(Buf).Free(); 
     } 
    } 
} 

我在另一边没有收到任何东西。任何想法?

+2

当.NET公开TcpClient甚至是'Socket'类时,为什么要使用WinSock? –

+0

@JohnSaunders这是一个挂钩的情况 –

回答

1

u_longunsigned long,它映射到uint,因为它是Microsoft Visual C编译器上的4字节数量。 Len应该是uint。可能WSASend只查看前4个字节,发现它们是0,这是一个零长度的缓冲区。

顺便说一句,你错了GCHandle.FromIntPtr。看看这些文档,看看它确实做了什么。这个问题并不重要,所以我不会详细说明。

+0

但它是u_long在MSDN上:http://msdn.microsoft.com/en-us/library/windows/desktop/ms741542%28v=vs.85%29.aspx –

+0

工程,还需要解决其他问题,但似乎这是解决发送问题的方法。 –