- 浏览: 331529 次
-
最新评论
-
riki:
D 语言学习交流群 264617728, 欢迎加入
D语言真相 The Case for D(1-5) -
exploder:
请教,如果使用D2进行wxD编译呢?
编译WxD0.16 -
blue_halo:
那如何解决呢????????
不能每次都用别的打开存成utf- ...
pyDev 中输入中文问题 -
funxue:
请教楼主
Error: undefined identifie ...
D语言版本的华容道 -
litsen:
在配置ms sqlserver的过程中遇到些问题,从Googl ...
安全第一,在sql server和client之间配置ssl连接
在WindowsNT平台上,最具有伸缩性和吞吐量的网络服务器程序都使用了完成端口。为了在D中使用完成端口,我写了这个简单的例子。希望大家指正!
在DMD1.020-1.022,WindowsXP,编译测试通过。
没有使用std.socket,因为std里面的socket实现不能使用重叠IO。
D 代码
- // D Program Language IOCP
- // write by ideage@gmail.com
- // complie: dmd ic ws2_32.lib
- import std.c.windows.windows, std.c.windows.winsock;
- import std.string, std.stdint, std.c.string, std.c.stdlib;
- import std.stdio;
- import std.thread;
- alias HANDLE WSAEVENT;
- alias OVERLAPPED WSAOVERLAPPED;
- alias OVERLAPPED* LPWSAOVERLAPPED;
- alias OVERLAPPED* POVERLAPPED, LPOVERLAPPED;
- struct GUID {
- align(1):
- DWORD Data1;
- WORD Data2;
- WORD Data3;
- BYTE Data4[8];
- }
- struct WSAPROTOCOLCHAIN {
- int ChainLen;
- DWORD[7] ChainEntries;
- }
- alias WSAPROTOCOLCHAIN* LPWSAPROTOCOLCHAIN;
- const WSAPROTOCOL_LEN = 255;
- const ERROR_IO_PENDING = 997;
- struct WSAPROTOCOL_INFOW {
- DWORD dwServiceFlags1;
- DWORD dwServiceFlags2;
- DWORD dwServiceFlags3;
- DWORD dwServiceFlags4;
- DWORD dwProviderFlags;
- GUID ProviderId;
- DWORD dwCatalogEntryId;
- WSAPROTOCOLCHAIN ProtocolChain;
- int iVersion;
- int iAddressFamily;
- int iMaxSockAddr;
- int iMinSockAddr;
- int iSocketType;
- int iProtocol;
- int iProtocolMaxOffset;
- int iNetworkByteOrder;
- int iSecurityScheme;
- DWORD dwMessageSize;
- DWORD dwProviderReserved;
- WCHAR[WSAPROTOCOL_LEN+1] szProtocol;
- }
- alias WSAPROTOCOL_INFOW* LPWSAPROTOCOL_INFOW;
- const WSA_FLAG_OVERLAPPED = 0x01;
- struct WSABUF {
- uint len;
- char* buf;
- }
- struct SOCKADDR {
- ushort sa_family;
- char[14] sa_data;
- }
- alias SOCKADDR* PSOCKADDR, LPSOCKADDR;
- alias WSABUF* LPWSABUF;
- alias uint GROUP;
- extern(Windows)
- {
- alias void function(DWORD, DWORD, LPWSAOVERLAPPED, DWORD) LPWSAOVERLAPPED_COMPLETION_ROUTINE;
- SOCKET WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD);
- bool GetQueuedCompletionStatus(HANDLE, PDWORD, PDWORD, LPOVERLAPPED*, DWORD);
- HANDLE CreateIoCompletionPort(HANDLE, HANDLE, DWORD, DWORD);
- int WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
- int WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
- }
- alias WSASocketW WSASocket;
- // Maximum Buffer Size
- const int BUFFERSIZE = 128;
- enum IO_OPERATION
- { ACCEPT,READ,WRITE };
- struct PIO_DATA
- {
- WSAOVERLAPPED ol;
- char Buffer[BUFFERSIZE];
- WSABUF wsabuf;
- int nTotalBytes;
- int nSentBytes;
- IO_OPERATION opCode;
- SOCKET activeSocket;
- }
- int max_ThreadCount;
- HANDLE iocpHandle = INVALID_HANDLE_VALUE;
- SOCKET serverSock;
- int WorkerThread (void * context)
- {
- LPWSAOVERLAPPED lpol = null;
- PIO_DATA* lpIOContext = null;
- WSABUF buffSend;
- uint dwRecvNumBytes = 0;
- uint dwSendNumBytes = 0;
- uint dwFlags = 0;
- uint dwIoSize = 0;
- bool bSuccess = false;
- int nRet = 0;
- while( 1 ) {
- void * lpCompletionKey = null;
- bSuccess = GetQueuedCompletionStatus(iocpHandle, &dwIoSize,cast(LPDWORD)&lpCompletionKey,cast(LPOVERLAPPED *)&lpol, INFINITE);
- if( !bSuccess )
- {
- writefln("GetQueuedCompletionStatus() failed: %s.",GetLastError());
- break;
- }
- lpIOContext = cast(PIO_DATA * )lpol;
- if(dwIoSize == 0) //socket closed?
- {
- writefln("ClientSocket Disconnect!" );
- closesocket(lpIOContext.activeSocket);
- // delete lpIOContext;
- continue;
- }
- if(lpIOContext.opCode == IO_OPERATION.READ) // a read operation complete
- {
- char[] s = "Echo:" ~ std.string.toString(lpIOContext.wsabuf.buf);
- lpIOContext.wsabuf.buf = std.string.toStringz(s);
- lpIOContext.nTotalBytes = lpIOContext.wsabuf.len;
- lpIOContext.nSentBytes = 0;
- lpIOContext.opCode = IO_OPERATION.WRITE;
- dwFlags = 0;
- nRet = WSASend(
- lpIOContext.activeSocket,
- &lpIOContext.wsabuf, 1, &dwSendNumBytes,
- dwFlags,
- &(lpIOContext.ol) , null);
- if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) )
- {
- writefln("1.WASSend Failed,Ret:%s." ,WSAGetLastError() );
- closesocket(lpIOContext.activeSocket);
- continue;
- }
- }
- else if(lpIOContext.opCode == IO_OPERATION.WRITE) //a write operation complete
- {
- lpIOContext.nSentBytes += dwIoSize;
- dwFlags = 0;
- if( lpIOContext.nSentBytes < lpIOContext.nTotalBytes ) {
- lpIOContext.opCode = IO_OPERATION.WRITE;
- // A Write operation has not completed yet, so post another
- // Write operation to post remaining data.
- buffSend.buf = lpIOContext.Buffer.ptr + lpIOContext.nSentBytes; //offset.
- buffSend.len = lpIOContext.nTotalBytes - lpIOContext.nSentBytes;
- nRet = WSASend (lpIOContext.activeSocket,
- &buffSend, 1, &dwSendNumBytes,
- dwFlags,
- &(lpIOContext.ol), null);
- if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {
- writefln("2.WASSend Failed,Ret:%s.",WSAGetLastError());
- closesocket(lpIOContext.activeSocket);
- continue;
- }
- }
- else
- {
- // Write operation completed, so post Read operation.
- lpIOContext.opCode = IO_OPERATION.READ;
- dwRecvNumBytes = 0;
- dwFlags = 0;
- lpIOContext.wsabuf.buf = lpIOContext.Buffer.ptr,
- lpIOContext.ol.Internal = 0;
- lpIOContext.ol.InternalHigh = 0;
- lpIOContext.ol.Offset = 0;
- lpIOContext.ol.OffsetHigh = 0;
- lpIOContext.ol.hEvent = null;
- lpIOContext.wsabuf.len = BUFFERSIZE;
- nRet = WSARecv(
- lpIOContext.activeSocket,
- &lpIOContext.wsabuf, 1, &dwRecvNumBytes,
- &dwFlags,
- &lpIOContext.ol, null);
- if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {
- writefln("1.WASRecv Failed,Ret:%s.",WSAGetLastError() );
- closesocket(lpIOContext.activeSocket);
- continue;
- }
- }
- }
- }
- return 0;
- }
- int main ()
- {
- { // Init winsock2.2
- WSADATA wsaData;
- int retVal = -1;
- if( (retVal = WSAStartup(0x2020, &wsaData)) != 0 ) {
- writefln("WSAStartup Failed,Ret: %s" ,retVal);
- return 1;
- }
- }
- writefln("WSAStartup Init OK!" );
- { //Create socket
- serverSock = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, null,0,WSA_FLAG_OVERLAPPED);
- if( serverSock == INVALID_SOCKET ) {
- writefln("Server Socket Creation Failed,Ret:%s." , WSAGetLastError() );
- return 1;
- }
- }
- writefln("Create socket OK!" );
- { //bind
- sockaddr_in service;
- service.sin_family = AF_INET;
- service.sin_addr.s_addr = htonl(INADDR_ANY);
- service.sin_port = htons(9001);
- int retVal = bind(serverSock,cast(sockaddr *)&service,service.sizeof);
- if( retVal == SOCKET_ERROR ) {
- writefln("Server Soket Bind Failed,Ret:%s." , WSAGetLastError() );;
- return 1;
- }
- }
- writefln("Binding ServerSocket OK!" );
- { //listen
- int retVal = listen(serverSock, 8);
- if( retVal == SOCKET_ERROR ) {
- writefln("Server Socket Listen Failed,Ret:%s." , WSAGetLastError() );;
- return 1;
- }
- }
- writefln("ServerSocket listen OK!" );
- //create iocp & binding serverSocket to iocp
- { // Create IOCP
- max_ThreadCount = 1 * 2;
- iocpHandle = CreateIoCompletionPort(INVALID_HANDLE_VALUE,null,0,max_ThreadCount);
- if (iocpHandle == null) {
- writefln("CreateIoCompletionPort() Failed,Ret:%s." , GetLastError() );
- return 1;
- }
- if (CreateIoCompletionPort(cast(HANDLE)serverSock,iocpHandle,0,0) == null){
- writefln("Binding Server Socket to IO Completion Port Failed,Ret:%s." , GetLastError() );
- return 1;
- }
- }
- writefln("Create IOCP & binding ServerSocket to IOCP OK!" );
- {
- Thread worker = new Thread(&WorkerThread, cast(void *)0);
- worker.start();
- }
- writefln("Create Worker threads OK, Waitting Client Connect..." );
- { //accept new connection
- while(1)
- {
- SOCKET clientsock = accept( serverSock, null, null );
- if(clientsock == SOCKET_ERROR) break;
- writefln("Client connected." );
- { //diable buffer to improve performance
- int nZero = 0;
- setsockopt(clientsock, SOL_SOCKET, SO_SNDBUF, cast(char *)&nZero, nZero.sizeof);
- }
- //binding ClientSocket to IOCP
- if (CreateIoCompletionPort(cast(HANDLE)clientsock,iocpHandle,0,0) == null){
- writefln("Binding Client Socket to IO Completion Port Failed,Ret:%s." , GetLastError() );
- closesocket(clientsock);
- }
- else {
- writefln("binding ClientSocket to IOCP OK!" );
- //post a recv request
- PIO_DATA data;
- data.opCode = IO_OPERATION.READ;
- data.nTotalBytes = 0;
- data.nSentBytes = 0;
- data.wsabuf.buf = data.Buffer.ptr;
- data.wsabuf.len = data.Buffer.sizeof;
- data.activeSocket = clientsock;
- uint dwRecvNumBytes=0,dwFlags=0;
- int nRet = WSARecv(clientsock,&data.wsabuf, 1, &dwRecvNumBytes,&dwFlags,&data.ol, null);
- if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError())){
- writefln("3.WASRecv Failed,Ret:%s." , WSAGetLastError() );;
- closesocket(clientsock);
- //delete data;
- }
- writefln("Post a recv request IOCP OK!" );
- }
- }
- }
- //close & Cleanup
- closesocket(serverSock);
- WSACleanup();
- return 0;
- }
评论
9 楼
ahadf
2007-10-22
"iocp的使用例子(哪怕是C方式的)在dsource上都找不到一个,仅此一条ideage的做法就值得称道."
---不想抬杠,不过偶手边的资料有5,6本书上都有类似的。网上一搜IOCP更是一大把。也许写个boost.asio D 语言简化版本还比较有价值。
---不想抬杠,不过偶手边的资料有5,6本书上都有类似的。网上一搜IOCP更是一大把。也许写个boost.asio D 语言简化版本还比较有价值。
8 楼
h_rain
2007-10-22
不错了.都这个样子了,进行封装也很简单了.
如果需要一个好的封装,需要考虑一些方面:IOCP句柄与状态查询的封装;线程的完善处理("逻辑"暂停,启动...);Socket句柄的重叠IO操作封装等;
如果想要一个完整的封装,这些东西的处理其实还是很复杂的.
如果需要一个好的封装,需要考虑一些方面:IOCP句柄与状态查询的封装;线程的完善处理("逻辑"暂停,启动...);Socket句柄的重叠IO操作封装等;
如果想要一个完整的封装,这些东西的处理其实还是很复杂的.
7 楼
tomqyp
2007-10-22
iocp的使用例子(哪怕是C方式的)在dsource上都找不到一个,仅此一条ideage的做法就值得称道。
6 楼
ahadf
2007-10-22
偶还是要说,又没用到D的特性,又没用到D的库,用C不挺好,为啥还要用D写呢?演示?这种程序书上网上一抓一大把,学C的比学D的人多多了,直接copy下来看的人指不定还多些。
5 楼
ideage
2007-10-22
这个例子关键是演示了IOCP在D语言中的应用:过程,方法。
已经写的IOCP的类,用在公司的程序,不能公开
已经写的IOCP的类,用在公司的程序,不能公开

4 楼
dayn9
2007-10-22
这只能说是批着D马甲的C程序吧?
oldrev老大,这点我持有异议。D也应该是多范式的语言,不能只有OO,OB,GP,否则会损失潜在用户,SP范式恰恰是用户最大的群体。
oldrev老大,这点我持有异议。D也应该是多范式的语言,不能只有OO,OB,GP,否则会损失潜在用户,SP范式恰恰是用户最大的群体。
3 楼
ahadf
2007-10-21
我还以为是一个IOCP的类。。。
2 楼
oldrev
2007-10-21
这只能说是批着D马甲的C程序吧?
1 楼
tomqyp
2007-10-20
收藏~
发表评论
-
最近抽空翻译了D语言实用入门教程
2018-04-20 10:42 937最近抽空翻译了D语言实用入门教程 地址在Github,供初 ... -
编译WxD0.16
2011-09-27 18:09 1780wx我在Python环境下用了 ... -
简单看了下DGui
2011-09-26 10:39 2346很久没有写代码了。。。。 怀念往日不如今天行动。生疏了 ... -
支持中文录入的harmonia
2010-08-16 22:40 1058harmonia界面很方便,发现不能录入中文.Patch一下. ... -
控制台得到密码不回显
2009-09-18 22:37 1298看到坛子有人问“在D或C下如何实现输入单个字符不回显?可能的应 ... -
D资源文件调用
2009-08-09 01:36 1095终于成功了。 资源文件太可爱,竟然可以如此。按名称进行 ... -
The Case for D中英文版PDF下载
2009-06-19 10:27 1451The Case for D 在网站上浏览不方便的,有了PD ... -
D语言真相 The Case for D(1-5)
2009-06-17 09:52 4957D语言真相 Andrei Alexandre ... -
The Case for D
2009-06-16 22:50 2339The Case for D Andrei Alexan ... -
Python嵌入D
2009-06-12 11:37 2021所有的嵌入都研究了一个遍。发现嵌入Python挺好,试试。 ... -
实用的DFL注册表
2009-05-27 09:09 1054应用中要用到注册表.DFL里面有. 参照了文档,写了一 ... -
DFL 2.027,1.041,2,3编译
2009-04-07 17:59 1632注:DFL已经更新,http://www.dprogrammi ... -
D2.0的字符串
2009-04-07 08:28 1409D2.0的字符串增加了常量,不变量和变量.在很大程度上增加了语 ... -
D语言编译器DMD开源了!
2009-03-05 19:56 3546自从1999年12月,Walter设计开发D语言以来,D语 ... -
D语言现状From2007
2009-03-02 15:32 1095I'm sure this was brought up in ... -
D语言GUI库简单比较
2009-02-20 15:25 3318通过对一些D语言可以使用的GUI进行比较,对初学者有个借 ... -
D语言脚本引擎简单比较
2009-02-19 14:38 1865经过长期的测试,使用,扩展代码编写,比较了D中可以使用的几种脚 ... -
D语言编译器开始支持Mac OSX
2009-02-15 18:25 1211D语言编译器开始支持Mac OSX。 D语言历经10年的发 ... -
触发DFL中的ComboBox控件的键盘事件
2009-02-06 12:04 1235class ComboxKeyDownFilter:IMess ... -
DFL分析(四)伟大的结构
2008-12-25 00:08 1453每个程序都有很多的代码编织而成.为了获得最大的兼容性,你要从容 ...
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip