我在改一个游戏,原客户端和服务器端都是C++;
客户端发消息是WSASend方法。
现在我能不能改写成C#的Socket.Send方法、发送的byte[] 该是怎样?
求教。
客户端发消息是WSASend方法。
现在我能不能改写成C#的Socket.Send方法、发送的byte[] 该是怎样?
求教。
解决方案 »
- 怎么获取腾讯rtx的组织架构呀
- 如何在Wince平台下,采用C#把字符串以Unicode的编码写入.TXT文件
- 在PictureBox中显示图像,然后我鼠标圈选某一局部图像,怎么显示圈选的矩形框?
- 请问sqlcommand怎么插入不进去记录!
- 路径问题?
- 如何在winform的窗体中建立一个类似于asp.net中的框架集的窗口?
- 关于限制输入的时间格式的文本框控件(mask)
- 批量插入数据库,用sqlDataAdapter.update快还是oledbDataAdapter.update快
- c#调用win32dll出错?
- 如何在c#中 限制文本框只能输入数字
- checkbox列的全选
- 挑战递归,求败贴。
如果一定要对应,.net中的Socket.BeginSend和Socket.SendAsync都是调用的wsasend
wsasend是win32 API和C#的socket.send有冲突吗?
知道发送的数据放在哪里不就够了吗?
wsasend 发送的是结构体嘛,具体怎样把wsasend的结构体转为Socket.BeginSend的byte[]
wsab[0].len = p0Length;
wsab[1].buf = p1Buffer;
wsab[1].len = p1Length;WSASend(sClient,wsab, 2, &s_dwTransferredBytes, 0, pSendOperation,StaticCompletionRoutine);大概代码是这样,我想知道用Socket.BeginSend的内容该是什么?
wsab[0].len = p0Length;
wsab[1].buf = p1Buffer;
wsab[1].len = p1Length;WSASend(sClient,wsab, 2, &s_dwTransferredBytes, 0, pSendOperation,StaticCompletionRoutine);
这是C++的代码,
能不能给个示范。
结构体序列化到byte[]数组我会。
关键是应该序列化哪部分.
你可以先看一下ArraySegment<byte>>这个结构的定义,实际上在IList<ArraySegment<byte>>做为参数被beginsend调用时,.net会将它转换为wsabuff[],如果一定要对应C++写法的话就使用IList<ArraySegment<byte>>。
从另一个层面说,wsabuff[]真正在传输时并没有分段这个概念,也是连续的数据传过去的,所以你把所有要传送的数据按照协议都序列化到一个数组中也没问题。
如果实在无法适应C#的写法,就用p/invoke来直接调用WSASend,也许你会更习惯一些。
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);
你定义一个缓冲区byte[]也好两个也好,把结构体序列化到byte[]中,根据序列化之后的offset和count定义两个ArraySegment<byte>>,加入到IList<ArraySegment<byte>>中。然后调用beginsend方法,参数包括这个IList<ArraySegment<byte>>,我解释的够清楚吗?
你先真正搞清楚c++的socket通信,再认真研究.net的socket通信,道理是完全一样的,我不知道这为什么会造成困惑。这个问题我不再回答了,我认为说得实在够清楚了,就差亲手给你写项目了。
例如
beginsend(wsab[1].buf,0,wsab[1].len,0,new AsyncCallback(Async_Send_Receive.Send_Callback))