我在改一个游戏,原客户端和服务器端都是C++;
客户端发消息是WSASend方法。
现在我能不能改写成C#的Socket.Send方法、发送的byte[] 该是怎样?
求教。

解决方案 »

  1.   

    C#改写客户端与对方通信,使用Socket的任意API都是可以的,不一定要与对方的API对应。
    如果一定要对应,.net中的Socket.BeginSend和Socket.SendAsync都是调用的wsasend
      

  2.   

    看不懂你说什么。
    wsasend是win32 API和C#的socket.send有冲突吗?
    知道发送的数据放在哪里不就够了吗?
      

  3.   


    wsasend 发送的是结构体嘛,具体怎样把wsasend的结构体转为Socket.BeginSend的byte[]
      

  4.   

    wsab[0].buf = p0Buffer;
    wsab[0].len = p0Length;
    wsab[1].buf = p1Buffer;
    wsab[1].len = p1Length;WSASend(sClient,wsab, 2, &s_dwTransferredBytes, 0, pSendOperation,StaticCompletionRoutine);大概代码是这样,我想知道用Socket.BeginSend的内容该是什么?
      

  5.   

    你把结构体序列化到byte[]数组,然后用IList<ArraySegment<byte>>。
      

  6.   

    wsab[0].buf = p0Buffer;
    wsab[0].len = p0Length;
    wsab[1].buf = p1Buffer;
    wsab[1].len = p1Length;WSASend(sClient,wsab, 2, &s_dwTransferredBytes, 0, pSendOperation,StaticCompletionRoutine);
    这是C++的代码,
    能不能给个示范。
    结构体序列化到byte[]数组我会。
    关键是应该序列化哪部分.
      

  7.   

    我不清楚“应该序列化哪部分”具体指什么。
    你可以先看一下ArraySegment<byte>>这个结构的定义,实际上在IList<ArraySegment<byte>>做为参数被beginsend调用时,.net会将它转换为wsabuff[],如果一定要对应C++写法的话就使用IList<ArraySegment<byte>>。
    从另一个层面说,wsabuff[]真正在传输时并没有分段这个概念,也是连续的数据传过去的,所以你把所有要传送的数据按照协议都序列化到一个数组中也没问题。
    如果实在无法适应C#的写法,就用p/invoke来直接调用WSASend,也许你会更习惯一些。
      

  8.   

    由于具体一些原因不能使用DLL,这个不做考虑。我具体不清楚WSASend最终也是调用SEND么?那它是怎样把结构体转换成buff[]的么?
    wsab[0].buf = p0Buffer;
    wsab[0].len = p0Length;
    wsab[1].buf = p1Buffer;
    wsab[1].len = p1Length;像下面对么?
    C#:
    p0Length 和p1Length 是 System.BitConverter.GetBytes((uint)len) 这样转的System.Array.Copy(p0Length, 0, res, 0, p0Length.Length);
    System.Array.Copy(p0Buffer, 0, res, p0Length.Length, p0Buffer.Length);System.Array.Copy(p1Length, 0, res, p0Length.Length + p0Buffer.Length, p1Length.Length);
    System.Array.Copy(p1Buffer, 0, res, p0Length.Length + p0Buffer.Length+p1Length.Length, p1Buffer.Length);
      

  9.   

    假设你要发送两个结构体A,B
    你定义一个缓冲区byte[]也好两个也好,把结构体序列化到byte[]中,根据序列化之后的offset和count定义两个ArraySegment<byte>>,加入到IList<ArraySegment<byte>>中。然后调用beginsend方法,参数包括这个IList<ArraySegment<byte>>,我解释的够清楚吗?
    你先真正搞清楚c++的socket通信,再认真研究.net的socket通信,道理是完全一样的,我不知道这为什么会造成困惑。这个问题我不再回答了,我认为说得实在够清楚了,就差亲手给你写项目了。
      

  10.   

    wsasend只是一次执行,发送多个buf,用beginsend或send,每次发一个缓冲区不行吗?
    例如
    beginsend(wsab[1].buf,0,wsab[1].len,0,new AsyncCallback(Async_Send_Receive.Send_Callback))