Profilo di Bin蜉蝣之冢FotoBlogElenchiAltro ![]() | Guida |
|
|
蜉蝣之冢为了遗忘的记录 17 febbraio house for rent华锈路255弄 整套2500块.
08年底的新房源,刚装修结束.
房子的外面.房间在4楼和5楼.2套.下面是4楼的. 这个是大门... 冰箱.. 厨房 浴室.. 还是浴室 小房间 阳台,还没打扫过... 朝南的 大房间.. 朝南的 大房间.. 朝南的 大房间..家里的大床.
18 gennaio 动画片里的场面06 gennaio 转:C#和C++结构体Socket通信转: C#和C++结构体Socket通信最近在用C#做一个项目的时候,Socket发送消息的时候遇到了服务端需要接收C++结构体的二进制数据流,这个时候就需要用C#仿照C++的结构体做出一个结构来,然后将其转换成二进制流进行发送,之后将响应消息的二进制数据流转换成C#结构。 1、仿照C++结构体写出C#的结构来 1using System.Runtime.InteropServices; 2 ![]() 3 [Serializable] // 指示可序列化4 [StructLayout(LayoutKind.Sequential, Pack = 1)] // 按1字节对齐5 public struct Operator6 ![]() 7{ 8 public ushort id;9 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] // 声明一个字符数组,大小为1110 public char[] name;11 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]12 public char[] pass;13 ![]() 14 public Operator(string user, string pass) // 初始化15 { 16 this.id = 10000;17 this.name = user.PadRight(11, '\0').ToCharArray();18 this.pass = pass.PadRight(9, '\0').ToCharArray();19 }20 }21 ![]() 22 ![]()
2、注意C#与C++数据类型的对应关系
整个结构的字节数是22bytes。 对应的C++结构体是:
1 typedef struct2{ 3 WORD id; 4 CHAR name[11];5 CHAR password[9];6 }Operator;7 ![]() 8 ![]() 3、发送的时候先要把结构转换成字节数组
1 using System.Runtime.InteropServices; 2 ![]() 3 /// <summary> 4 /// 将结构转换为字节数组5 /// </summary>6 /// <param name="obj">结构对象</param>7 /// <returns>字节数组</returns>8 public byte[] StructToBytes(object obj)9 { 10 //得到结构体的大小11 int size = Marshal.SizeOf(obj);12 //创建byte数组13 byte[] bytes = new byte[size];14 //分配结构体大小的内存空间15 IntPtr structPtr = Marshal.AllocHGlobal(size);16 //将结构体拷到分配好的内存空间17 Marshal.StructureToPtr(obj, structPtr, false);18 //从内存空间拷到byte数组19 Marshal.Copy(structPtr, bytes, 0, size);20 //释放内存空间21 Marshal.FreeHGlobal(structPtr);22 //返回byte数组23 return bytes;24 ![]() 25 }26 ![]() 27 ![]() 接收的时候需要把字节数组转换成结构
1/// <summary> 2 /// byte数组转结构3 /// </summary>4 /// <param name="bytes">byte数组</param>5 /// <param name="type">结构类型</param>6 /// <returns>转换后的结构</returns>7 public object BytesToStruct(byte[] bytes, Type type)8 { 9 //得到结构的大小10 int size = Marshal.SizeOf(type);11 Log(size.ToString(), 1);12 //byte数组长度小于结构的大小13 if (size > bytes.Length)14 { 15 //返回空16 return null;17 }18 //分配结构大小的内存空间19 IntPtr structPtr = Marshal.AllocHGlobal(size);20 //将byte数组拷到分配好的内存空间21 Marshal.Copy(bytes, 0, structPtr, size);22 //将内存空间转换为目标结构23 object obj = Marshal.PtrToStructure(structPtr, type);24 //释放内存空间25 Marshal.FreeHGlobal(structPtr);26 //返回结构27 return obj;28 }29 ![]() 4、实际操作:
1 using System.Collections;2 using System.Collections.Generic;3 using System.Net;4 using System.Net.Sockets;5 ![]() 6 byte[] Message = StructToBytes(new Operator("user","pass")); // 将结构转换成字节数组7 ![]() 8 TcpClient socket = new TcpClient();9 ![]() 10 socket.Connect(ip,port);11 ![]() 12 NetworkStream ns = Socket.GetStream();13 ![]() 14 ns.Write(Message,0,Message.Length); // 发送15 ![]() 16 byte[] Recv = new byte[1024]; // 缓冲17 ![]() 18 int NumberOfRecv = 0;19 ![]() 20 IList<byte> newRecv = new List<byte>();21 ns.ReadTimeout = 3000;22 try23{ 24 do25{ 26 // 接收响应27 NumberOfRecv = ns.Read(Recv, 0, Recv.Length);28 for (int i = 0; i < NumberOfRecv; i++)29 newRecv.Add(Recv[i]);30 }31 while (ns.DataAvailable);32 byte[] resultRecv = new byte[newRecv.Count];33 newRecv.CopyTo(resultRecv, 0);34 ![]() 35 Operator MyOper = new Operator();36 ![]() 37 MyOper = (Operator)BytesToStruct(resultRecv, MyOper.GetType()); // 将字节数组转换成结构38 ![]() 在这里取值的时候可能会出现只能取到一个字段,剩余的取不到的问题,怎么回事我也搞不懂,反正我的解决办法就是按照字节的顺序从resultRecv里分别取出对应的字段的字节数组,然后解码,例如: Operator.name是11个字节,最后一位是0,Operator.id是2个字节,那么从第3位到第12位的字节就是Operator.name的内容,取出另存为一个数组MyOperName,Encoding.Default.GetString(MyOperName)就是MyOper.name的内容。
1 socket.Close();2 ![]() 3 ns.Close();4 ![]() 以上是从别处转过来的,方便自己看看.特此注明! 12 dicembre 国之将亡,必有妖孽国之将亡,必有妖孽.
妖孽之甚,若秋叶.
昔一白丁,始从安保,痴游戏,遂三荐于国,冀国策,诺!
随诸策议,寐,君温而不怒,若才之性,惹诸策.遂策之议,癫者癫,寐者寐,莫不现才之性,君大乐.
才之将帅者,于国出.君顿悟,无奈癫者当道,求良方,白丁谏曰妖孽不除何以正国.诺!遂逐其去.
25 maggio ibatis与MYSQL问题解决记录软件环境: 新项目用IBATIS+spring +struts数据库用MYSQL
IBATIS问题:
SQLMAPCONFIG不能正确加载:检查之后发现是相对路径问题。
接着又发现SQLMAP解析出错:
1,DTD被我删掉了(之前因为路径问题,手动改了很多东西)
2,在正确添加DTD以后还是不能正常解析,访国外BBS,发现是命名空间被我禁用造成。(我是用ECLIPSE查件ABATOR自动生成的)
至此问题解决。暂时只测试了一个表。
下面问题又来了,中文问题
我是UTF-8的JSP页面+FILTER请求UTF-8,在插入数据库以后,中文是??。
MYSQL我是第一次用。GOOGLE一把,发现在MY.INI里,也要设一下,不过没用。。。。
最后一高人大哥的BLOG里找到答案,在连接URL最后加上?characterEncoding=utf-8
一下给出那位大哥的文章连接 http://netbeyond.blog.hexun.com/12666107_d.html 10 maggio 被MS郁闷了两天.这个问题很妖异我本来做了2个下拉框,一个省,一个城市,用Icallbackeventhandler接口来实现所谓的AJAX效果.郁闷从此开始,回调不执行了.我开始用ALERT查JS代码,无果.接着看后台代码,那几行也没什么问题,在PAGEONLOAD里只有2段代码,一段是注册JS,一段是填充省份下拉框,我把填充那段注释掉,再运行一次,结果奇迹般的正常了,我开始怀疑是不是代码冲突.试了几个位置,只要是执行了填充的,就不能正常回调了.
以下是我的代码:
protected void Page_Load(object sender, EventArgs e)
{ initSelect(); ClientScriptManager cm = Page.ClientScript; String cbReference = cm.GetCallbackEventReference(this, "args", "GetData", "", false); String callbackScript = @"function CallServer(args,context) { args=select('"+this.DropDownList2.ClientID+"',context);" + cbReference + ";}"; cm.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true); } private void initSelect() { Bo.ProvinceBo pbo = new Bo.ProvinceBo(); this.DropDownList2.DataSource = pbo.GetAll(); this.DropDownList2.DataTextField = "prov"; this.DropDownList2.DataValueField = "prov"; this.DropDownList2.DataBind(); } 然后开始分段测试initSelect()里面的语句发现,只要把DataValueField 等于ID列,就可以正常执行.prov列是中文,ID列是数字,只有这2个区别.
现在问题找到了.中文......网上搜了一下,也有一位大哥碰到过这样的问题,他讲的比较全面.
15 aprile 史前一万年开始:
男主角倒在地上,他面前是一只剑齿虎,它看了看他,就走了,
迷之声:"我们有自己的预言,能和剑齿虎沟通的人,会带领我们"
这个时候,镜头很严肃的转向一块石头,上面的涂鸦,就是之前的场景.
看到这里,我笑了,整个放映厅都笑了.我想起了陈凯歌,想起了满神,想起了馒头.....
结尾:
男主角带领众人干倒了法老,可是就在女主角满心欢喜的跑向男主角的时候,她中箭了......
男主角悲痛欲绝,奔到了长齿象面前,挑逗它,可是,这次的男主角不是金城武,长齿象也不是刘德华.......
它没有和他对决,走了......
男主角若有所悟,奔回女主角身边.
迷之声:"老妈妈用最后一口气,就了她!"
女主角倒吸了一口凉气,醒了,他们拥抱,他们欢呼......
她就是 张子仪.....(对不起,我现在才发现,不知道她的名字具体怎么写,如果写错了,请原谅.)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|