上一篇:深入解析C++中的三个修饰符 >>
用Sockets接收和转换数字和字符串数据
多时候远程系统在执行并发任务的时候,会把它接收到数据的长度以数字的形式发送出去。但用socket发送和接收数字型数据的时候,要考虑到一个问题:要根据网络另一端机器的类型转换数据。尤其需要知道怎样把要发送的数据格式(网络格式)从本地机器的格式(主机格式)转换成为行业标准格式。
使用IPAddress.NetworkToHostOrder可以把数据从网络规则转换为主机格式,下面的ReceiveHeader函数说明了它的用法,ReceiveHeader函数实现过程如下:
1 用Socket.Receive从远程机器接收数据。
2 验证接收到的字节数是4。
3 Socket.Receive返回一个字节型数组,BitConvert.ToInt32把它转换成数字型数值。
4 最后,IPAddress.NetworkToHostOrder把长数值转换为主机格式。
public int ReceiveHeader(Socket socket)
{
int dataSize = -1; // error
byte [] buffer = new byte[4];
int bytesRead = socket.Receive(buffer, 4,
System.Net.Sockets.SocketFlags.None);
if (4 == bytesRead)
{
dataSize = BitConverter.ToInt32(buffer, 0);
dataSize = IPAddress.NetworkToHostOrder(dataSize);
}
else // error condition
return dataSize;
}
下面再来看一下怎样用多线程读取的方法为每个字符串都建立连接,从远程机器接收字符串型数据。在这种情况下,要把字节型数据转换成String型对象。你可以根据需要用ASCIIEncoding或UnicodeEncoding类进行转换。ReceiveDetail函数按以下步骤实现(此函数必须在ReceiveHeader后调用,因为datasize的值是从ReceiveHeader中得到的。)
1 在while循环中调用Socket.Receive,直到无返回值为止。数据被读入一个字节型数组。
2 建立一个ASCIIEncoding对象。
3 调用ASCIIEncoding.GetString把字节型数组转换成String对象,然后把它和先前读入的数据连接。
public string ReceiveDetail(Socket socket, byte[] buffer,
int dataSize)
{
string response = "";
int bytesReceived = 0;
int totalBytesReceived = 0;
while (0 < (bytesReceived =
socket.Receive(buffer, (dataSize - totalBytesReceived),
SocketFlags.None)))
{
totalBytesReceived += bytesReceived;
ASCIIEncoding encoding = new ASCIIEncoding();
response += encoding.GetString(buffer, 0, bytesReceived);
}
return response;
}
下一篇:用VB进行超长字符串的运算 >>
相关文章:
- · 平台+插件软件设计思想及基于COM的原型实现
- · 利用WebBrowser控件创建自己的浏览器
- · Windows下实时行式打印系统设计
- · VC下打印机的使用
- · 获取有关显示器、鼠标及系统的配置信息
- · 利用ActiveX控件开发串口通信软件
- · 如何模拟《WORD》的窗口形式
- · OICQ登录号码清除器实现原理
- · 用VC 6.0实现串行通信的三种方法
- · FMD开发文集 -- CArchive原理
- · 进一步理解VC中的句柄
- · 显示和杀死系统当前进程
- · 使用CTabCtrl控件实现属性页功能
- · 在状态条中显示鼠标的设备坐标与逻辑坐标
- · Application Wizard生成的项目文件简介
- · 一个非常有用的曲线显示控件
- · 用于文件压缩的微软FCI/FDI库介绍
- · 做一个可编辑的表格控件
- · 全局函数的另一种实现
- · 单文档与多视的实现方法
- · 显示作为窗口或对话框背景的位图
- · 检验EXE文件的完整性
- · 利用钩子实现菜单阴影效果
- · 让对话框显示背景图
- · 各种排序算法
- · 实现带阴影弹出的窗口
- · 深度解析VC中的消息传递机制(上)
- · 深度解析VC中的消息传递机制(下)
- · VC通用控件编程之CSlider控件
- · VC通用控件编程之CProgress控件
- · VC通用控件编程之CList控件
- · VC通用控件编程之CImageList控件
- · VC通用控件编程之CHeadCtrl控件
- · VC++的链接错误LNK2001
- · 处理内存泄漏的一种MFC方法
- · 针对Excel表格文件操作的编程实现
- · Win32 核心 DPC 设计思想和实现思路浅析
- · VC++5.0下MIDI、WAV及CD的播放
