一个小问题发“5”次,无人问津只能请专家出场!

螳螂86 2009-04-23 01:46:54

c++客户端和C#服务器的通讯问题
我写的代码有问题,但不知怎么修改获取到数据,,,还望高手请教

C++发送数据,C#接收C++发送过来的结构体数据!

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.IO;

namespace ConsoleServer
{
class Server
{
static void Main(string[] args)
{
Console.WriteLine("Server Running……");

IPAddress m_ipaddress = IPAddress.Parse("127.0.0.1");
int m_port = Convert.ToInt32(8088);
IPEndPoint m_ipep = new IPEndPoint(m_ipaddress, m_port);
TcpListener m_tcplistener = new TcpListener(m_ipep);
m_tcplistener.Start();

Console.WriteLine("Server Listening……");

while (true)
{
TcpClient m_tcpclient = m_tcplistener.AcceptTcpClient();
ServerSocket m_serversocket = new ServerSocket(m_tcpclient);
}
}
}

public class ServerSocket
{
private TcpClient m_tcpclient;
private NetworkStream m_networkstream;
private const int m_buffersize = 8192;
private byte[] m_buffer;
private StructHandler m_structhandler;

public ServerSocket(TcpClient _tcpclient)
{
this.m_tcpclient = _tcpclient;
Console.WriteLine("Client Connectting: {0} <-- {1}", m_tcpclient.Client.LocalEndPoint, m_tcpclient.Client.RemoteEndPoint);
this.m_networkstream = _tcpclient.GetStream();
this.m_buffer = new byte[m_buffersize];
this.m_structhandler = new StructHandler();

AsyncCallback m_asynccallback = new AsyncCallback(StepAsyncCallback);
m_networkstream.BeginRead(m_buffer, 0, m_buffersize, m_asynccallback, null);
}

private void StepAsyncCallback(IAsyncResult _asyn)
{
try
{
int m_bytes = 0;
lock (m_networkstream)
{
//获取数据包字节数
m_bytes = m_networkstream.EndRead(_asyn);
Console.WriteLine("Reading Client Data: {0} bytes", m_bytes);
}
if (m_bytes == 0) throw new Exception("读取到0字节");

//解析数据包内容
string m_msg = Encoding.Unicode.GetString(m_buffer, 0, m_bytes);
//获取数据包
byte[] m_packet = Encoding.Unicode.GetBytes(m_msg);
//转换数据格式
StructHandler.ResponseLogin m_socketpaket = Bytes2Struct <StructHandler.ResponseLogin>(m_packet);

Console.WriteLine(m_socketpaket.Id);
Console.WriteLine(Encoding.ASCII.GetBytes(m_socketpaket.Account));
Console.WriteLine(Encoding.ASCII.GetBytes(m_socketpaket.Password));
//转换数据格式
m_packet = Struct2Bytes <StructHandler.ResponseLogin>(m_socketpaket);
//写出数据
m_networkstream.Write(m_packet, 0, m_packet.Length);
m_networkstream.Flush();
Console.WriteLine("发送数据包: {0}", m_packet);

// 无限循环调用BeginRead()
lock (m_networkstream)
{
AsyncCallback m_AsyncCallback = new AsyncCallback(StepAsyncCallback);
m_networkstream.BeginRead(m_buffer, 0, m_buffersize, m_AsyncCallback, null);
}
}
catch (Exception ex)
{
if (m_networkstream != null)
{
m_networkstream.Dispose();
}
m_tcpclient.Close();
Console.WriteLine(ex.Message);
}
}
//结构体转换
private byte[] Struct2Bytes <T>(T obj)
{
int size = Marshal.SizeOf(obj);
byte[] bytes = new byte[size];
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
Marshal.StructureToPtr(obj, arrPtr, true);
return bytes;
}
//结构体转换
private T Bytes2Struct <T>(byte[] bytes)
{
IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
return (T)Marshal.PtrToStructure(arrPtr, typeof(T));
}
}
// 数据结构体
public class StructHandler
{
[Serializable]
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct ResponseLogin
{
public long Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public char[] Account;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public char[] Password;

public ResponseLogin(string _account, string _password)
{
this.Id = 10000;
this.Account = _account.PadRight(20, '\0').ToCharArray();
this.Password = _password.PadRight(50, '\0').ToCharArray();
}
}
public enum ProtocolID
{

}

[Serializable]
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct PackHead
{

}

[Serializable]
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct PackBody
{
PackHead Head;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
char[] PackData;
byte StateData;
}
public struct ClientMessage
{
ProtocolID Pid;
PackBody MsgBody;
}
}
}
...全文
887 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xandercheng 2010-10-19
  • 打赏
  • 举报
回复
LZ头像太淫荡了
aarondai 2009-04-24
  • 打赏
  • 举报
回复
牛人的代码
螳螂86 2009-04-24
  • 打赏
  • 举报
回复
我自己顶
KKND2006 2009-04-24
  • 打赏
  • 举报
回复
C++不要发STRUCT,如果C++那边用了不一样的串行化策略,和C#对不上,你解析很费劲的

用XML就行了
npy601 2009-04-24
  • 打赏
  • 举报
回复
顶一下。
flyerwing 2009-04-24
  • 打赏
  • 举报
回复
你是没收到数据 一个byte也没收到?
还是收到了无法解析?
jimgreat 2009-04-24
  • 打赏
  • 举报
回复
你是没收到数据 一个byte也没收到?
还是收到了无法解析?
boywangliang 2009-04-23
  • 打赏
  • 举报
回复
帮顶
jivvuw 2009-04-23
  • 打赏
  • 举报
回复
问题是什么???先说下问题啊~~~
螳螂86 2009-04-23
  • 打赏
  • 举报
回复
谢谢楼上大哥的提醒,但是还是无效,真不知道具体的问题出在哪里
guoyichao 2009-04-23
  • 打赏
  • 举报
回复
char[] PackData 改成 byte[] PackData
螳螂86 2009-04-23
  • 打赏
  • 举报
回复
//解析数据包内容
string m_msg = Encoding.ASCII.GetString(m_buffer, 0, m_bytes);
//获取数据包
byte[] m_packet = Encoding.ASCII.GetBytes(m_msg);

?改后还是无法获取数据
螳螂86 2009-04-23
  • 打赏
  • 举报
回复
C++是不是以ASCII编码发送的数据
_see_you_again_ 2009-04-23
  • 打赏
  • 举报
回复
Garnett_KG 2009-04-23
  • 打赏
  • 举报
回复
错误消息是什么?

C++是不是以Unicode编码发送的数据?

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧