DELPHI中完成端口(IOCP)的简单分析(4)
来源:互联网 发布:淘宝模版一键装修 编辑:程序博客网 时间:2024/06/15 17:44
在我以前写的文章中,一直说的是如何接收数据。但是对于如何发送数据却一点也没有提到。因为从代码量上来说接收的代码要比发送多很多。今天我就来写一下如何使用IOCP发送数据。
function TNetControl.SendSpecifyData(const Socket: TSocket; Data: array of char;
DataLen: Integer): Boolean;
const
DATA_BUFSIZE = 1024; //这里定义一个发送数据的缓存长度,只要和接收的一直就可以
var
PerIoData: LPPER_IO_OPERATION_DATA ;
SendBytes, RecvBytes: DWORD;
Flags: DWORD ;
LenStr:String;
SendBuf:array [0..DATA_BUFSIZE] of char;
begin
try
//由于粘包的关系,所以在需要发送的数据前面加入4位这次发送数据的长度。(详见我的前一篇文章)
SetArrayLength(DataLen,LenStr) ;
Fillchar(SendBuf,sizeof(SendBuf),#0);
strmove(SendBuf,Pointer(LenStr),4);
strmove(SendBuf+4,Data,DataLen);
//在这里申请一个发送数据的"单IO数据结构"
PerIoData := LPPER_IO_OPERATION_DATA(GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)));
if (PerIoData = nil) then
begin
Result:=false;
exit;
end;
ZeroMemory(@PerIoData.Overlapped, sizeof(OVERLAPPED));
//设置发送标记
PerIoData.BytesRECV := 0;
PerIoData.DataBuf.len := DataLen+4;
PerIoData.DataBuf.buf:=@SendBuf;
PerIoData.BytesSEND := DataLen+4;
Flags := 0;
//使用WSASend函数将数据发送
if (WSASend(Socket, @(PerIoData.DataBuf), 1, @SendBytes, 0,@(PerIoData.Overlapped), nil) = SOCKET_ERROR) then
begin
if (WSAGetLastError() <> ERROR_IO_PENDING) then
begin
Exit;
Result:=false;
end;
end;
Result:=true;
except
Result:=false;
end;
end;
使用IOCP发送数据的代码就这些,但是这里需要说明一些问题。
1:读者一定发送我们在申请了“单IO数据结构”以后并没有对它进行释放。这是因为我们使用的是异步函数WSASend来进行发送数据,只有当我们确定将数据发送出去以后才可以将我们申请的这个结构释放。这就引出了第二个问题。
2:如何判断我们发送的数据已经发送。向我以前的文章中所说的“IOCP可以接受来自客户端的数据和自己发送出去的数据”,而区分这个数据是来自客户端还是自己发送出去的区分就是使用PerIoData.BytesRECV 和PerIoData.BytesSEND 如果PerIoData.BytesSEND >0则表示这个数据是自己发送出去的。现在咱们来回顾一下以前的代码,找出释放“单IO数据结构”的地方。
在第二篇文章我写了这样的代码。
//当我们判断出来接受的数据是我们发送出去的数据的时候,在这里我们清空我们申请的内存空间
else
begin
GlobalFree(DWORD(PerIoData));
end;
这里就是我们释放“单IO数据结构”的地方。
到此我已经将整个的IOCP从创建、初始化、接收和发送简单的描述了一下。如果读者根据我写的思路或者代码就可以编写出以后稳定的基于IOCP的网络程序。
- DELPHI中完成端口(IOCP)的简单分析(4)
- DELPHI中完成端口(IOCP)的简单分析(4)
- DELPHI中完成端口(IOCP)的简单分析(1)
- DELPHI中完成端口(IOCP)的简单分析(2)
- DELPHI中完成端口(IOCP)的简单分析(3)
- DELPHI中完成端口(IOCP)的简单分析(1)
- DELPHI中完成端口(IOCP)的简单分析(2)
- DELPHI中完成端口(IOCP)的简单分析(3)
- DELPHI中完成端口(IOCP)的简单分析
- DELPHI中完成端口(IOCP)的简单分析完整篇
- Delphi中完成端口(IOCP)的简单分析
- DELPHI中完成端口(IOCP)的简单分析(1)
- DELPHI中完成端口(IOCP)的简单分析(2)
- IOCP完成端口的简单例子
- IOCP完成端口简单Demo
- IOCP完成端口的一个简单封装类
- IOCP完成端口的一个简单封装类 (转)
- 在c#使用IOCP(完成端口)的简单示例
- 性能优化:(From D3D9 SDK)
- DELPHI中完成端口(IOCP)的简单分析(2)
- 安装cgicc
- DELPHI中完成端口(IOCP)的简单分析(3)
- 文匣文章管理系统v2.01版正式发布
- DELPHI中完成端口(IOCP)的简单分析(4)
- 发布IBatisNetProvider
- javamail javax.mail.MessagingException: Could not connect to SMTP host:
- asp.net 发送邮件代码
- 使用JSP开发应用程序时的编码(中文等乱码)问题的建议解决方案(包括接受request和数据库操作)
- gentoo 升级小记
- 新标日语初级第25课应用课文默写
- 非Windows系统上的.NET框架
- 编写Palm J2ME红外线“聊天”程序