在WINCE中基于ActiveSync的Socket通信
来源:互联网 发布:java类的反射机制 编辑:程序博客网 时间:2024/06/09 23:28
转自 http://www.cnblogs.com/poplau/archive/2011/03/31/2001561.html
一、序
之前做WINCE的项目,涉及到PC与PDA通信的时候,采用的是ActiveSync的通信方式,在PC上采用RAPI函数对PDA中的数据或文件进行控制,这种方式是单项的,与PDA中的程序基本无联系,在扩展性和功能性方面存在一些局限性。
采用Socket通信是一种不错的选择,但由于应用在特殊行业,不能使用WIFI模块和3G模块,PDA上没有分配IP地址,好像并不具备Socket通信的条件。
在查找了一些资料后发现ActiveSync通信其实是基于TCP的连接方式,既然是TCP,那么一定有地址和端口。
在PDA程序中运行:二、基于ActiveSync的Socket通信
当PDA与PC通过ActiveSync的方式连接后,PDA会得分配到192.168.55.101的IP地址,PC会分配到192.168.55.100的IP地址,值得注意的是PC上的这个IP地址是无法通过Ipconfig指令查找到的,也无法ping通,无法Bind,不算是一个真正意义上的IP地址。而且任何一台PDA通过ActiveSync连接后,地址都相同(PC 192.168.55.100,PDA 192.168.55.101)。
初步确定采用PC作为Socket Server端,PDA作为Socket Client端进行数据通信这种方式后(注1),就着手开始编写代码。2.1 Socket Server端(PC服务器)
代码与普通Socket Server代码没什么两样,值得注意的是Bind的IP地址不能为192.168.55.100,也不能为该计算机的网络IP地址,而需要绑定“127.0.0.1”。m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_Socket.Bind(iep);
2.2Socket Client端(PDA端 WINCE)
代码与普通Socket Client代码差不多,连接的地址设置为“192.168.55.100”,可采用这样的方式编写:try
{
m_ServerIp = Dns.GetHostEntry(“PPP_PEER”).AddressList[0].ToString();
}catch {
m_ServerIp = "192.168.55.100";
}
IPAddress serverIp = IPAddress.Parse(m_ServerIp);
int serverPort = 10000;
IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
m_SocketConnection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_SocketConnection.Connect(iep);
三、Socket中涉及到的结构字节数组转换
Socket通信中涉及到很多结构与字节数组的转换,在WINDOW上运行正常的程序在WINCE中会报”不支持….”的异常。代码如下:
public struct SocketMsg
{
public SocketMsgType MsgId; //枚举类型
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string MsgDatetime;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string MsgContent;
}
SocketMsg msg = new SocketMsg();
Msg.MsgId = 0;
Msg.MsgDatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Msg.MsgContent = "";
private byte[] MsgStructToByte(SocketMsg msg)
{
int size = Marshal.SizeOf(msg);
System.IntPtr ptr = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(msg, ptr, false);
byte[] ba = new byte[size];
Marshal.Copy(ptr, ba, 0, ba.Length);
return ba;
}
finally
{
Marshal.FreeHGlobal(ptr);
}
}
public struct SocketMsg
{
public SocketMsgType MsgId; //枚举类型
[MarshalAs(UnmanagedType. ByValArray, SizeConst = 20)]
public byte[] MsgDatetime;//注3
[MarshalAs(UnmanagedType. ByValArray, SizeConst = 100)]
public byte[] MsgContent;
}
SocketMsg msg = new SocketMsg();
msg.MsgId = 0;
msg.MsgDatetime = Encoding.ASCII.GetBytes(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+" ");
msg.MsgContent = new byte[100];
四、另外一些补充说明
OpenNETCF是一个很好的开发库,但是在WINCE中,由于一些DLL不存在,因此需要有选择的使用。例如因为没有Cellcore.dll这个文件(Windows mobile支持),在WINCE中无法使用OpenNETCF.Net Namespace中的ConnectionManager Class来管理网络连接状态。
附:
以上代码的环境为:
PC端:WIN2003,ActiveSync4.5,F2.0
PDA端:WINCE5.0,CF2.0
注1:Google里资料说PDA作为Socket Server ,PC作为Socket Client的好像无法实现,因此就没有进行测试,有兴趣的朋友可测试一下。
注2:不能用Socket.Send,测试发现在Socket Server服务关闭的情况下,Connect后Send有时也会成功
注3:在WINCE中 char默认为unicode16位,因此在定义结构体时最好采用byte。
- 在WINCE中基于ActiveSync的Socket通信 c#
- 在WINCE中基于ActiveSync的Socket通信 c#
- 在WINCE中基于ActiveSync的Socket通信
- 如何在wince BSP中设置activesync 通讯所需要的参数
- Java中基于TCP的Socket通信
- Android中基于Socket的网络通信
- Android中基于Socket的网络通信
- 怎么添加ActiveSync到wince中
- winCE 下 evc 的 Socket 通信
- 使用ActiveSync同步WinCE设备,并在局域网中调试网络程序
- wince 通信方式 SOCKET
- Android中基于protobuf的socket通信的实例
- wince模拟器 连接 activesync的问题
- WinCE 基于Wlan的TCP/IP通信
- WinCE 基于Wlan的TCP/IP通信
- 基于VC++的WinCE网络通信
- 基于Socket通信的聊天室
- 基于UDP的socket通信
- 【Python】曲线简化算法实现
- Java集合
- 剑指Offer面试题9(java版)斐波那契数列
- I
- Mosquitto安装和使用
- 在WINCE中基于ActiveSync的Socket通信
- IntelliJ Idea 2017 注册码 免费激活方法
- cnaiapi.h头文件
- 求带环链表入口点 计算时间复杂度
- 分享回调地狱的体现与利用es6 Promise对回调的改良和实现
- python中if命令简单介绍及注意事项(含笔记)
- 部署JForum 2.1.9遇到的问题及解决方法
- 编程测试顺序容器矢量(vector)的主要功能和使用方法
- 你好,下半年