CArray在完成端口中使用 急急急!!!请帮忙

夫人的泡泡鱼 2013-10-26 12:15:07
问题是这样的参考这个代码(http://bbs.csdn.net/topics/380022186)学习完成端口。
现在我实在VC6.0下用MFC来开发的。定义结构体时出现的错误具体的代码如下

#pragma once
// winsock 2 的头文件和库
#include <winsock2.h>
#include <MSWSock.h>
#pragma comment(lib,"ws2_32.lib")
#include "afxtempl.h"
// 缓冲区长度 (1024*8)
// 之所以为什么设置8K,也是一个江湖上的经验值
// 如果确实客户端发来的每组数据都比较少,那么就设置得小一些,省内存
#define MAX_BUFFER_LEN 8192
// 默认端口
#define DEFAULT_PORT 5000
// 默认IP地址
#define DEFAULT_IP _T("127.0.0.1")
// 每一个处理器上产生多少个线程(为了最大限度的提升服务器性能,详见配套文档)
#define WORKER_THREADS_PER_PROCESSOR 2
//////////////////////////////////////////////////////////////////
// 在完成端口上投递的I/O操作的类型
typedef enum _OPERATION_TYPE
{
ACCEPT_POSTED, // 标志投递的Accept操作
SEND_POSTED, // 标志投递的是发送操作
RECV_POSTED, // 标志投递的是接收操作
NULL_POSTED // 用于初始化,无意义

}OPERATION_TYPE;
//====================================================================================
//
// 单IO数据结构体定义(用于每一个重叠操作的参数)
//
//====================================================================================
typedef struct _PER_IO_CONTEXT
{
OVERLAPPED m_Overlapped; // 每一个重叠网络操作的重叠结构(针对每一个Socket的每一个操作,都要有一个)
SOCKET m_sockAccept; // 这个网络操作所使用的Socket
WSABUF m_wsaBuf; // WSA类型的缓冲区,用于给重叠操作传参数的
char m_szBuffer[MAX_BUFFER_LEN]; // 这个是WSABUF里具体存字符的缓冲区
OPERATION_TYPE m_OpType; // 标识网络操作的类型(对应上面的枚举)

// 初始化
_PER_IO_CONTEXT()
{
ZeroMemory(&m_Overlapped, sizeof(m_Overlapped));
ZeroMemory( m_szBuffer,MAX_BUFFER_LEN );
m_sockAccept = INVALID_SOCKET;
m_wsaBuf.buf = m_szBuffer;
m_wsaBuf.len = MAX_BUFFER_LEN;
m_OpType = NULL_POSTED;
}
// 释放掉Socket
~_PER_IO_CONTEXT()
{
if( m_sockAccept!=INVALID_SOCKET )
{
closesocket(m_sockAccept);
m_sockAccept = INVALID_SOCKET;
}
}
// 重置缓冲区内容
void ResetBuffer()
{
ZeroMemory( m_szBuffer,MAX_BUFFER_LEN );
}

} PER_IO_CONTEXT, *PPER_IO_CONTEXT;
//====================================================================================
//
// 单句柄数据结构体定义(用于每一个完成端口,也就是每一个Socket的参数)
//
//====================================================================================
typedef struct _PER_SOCKET_CONTEXT
{
SOCKET m_Socket; // 每一个客户端连接的Socket
SOCKADDR_IN m_ClientAddr; // 客户端的地址
CArray< _PER_IO_CONTEXT * > m_arrayIoContext; // 客户端网络操作的上下文数据,也就是说对于每一个客户端Socket,是可以在上面同时投递多个IO请求的
// 初始化
_PER_SOCKET_CONTEXT()
{
m_Socket = INVALID_SOCKET;
memset(&m_ClientAddr, 0, sizeof(m_ClientAddr));
}
// 释放资源
~_PER_SOCKET_CONTEXT()
{
if( m_Socket!=INVALID_SOCKET )
{
closesocket( m_Socket );
m_Socket = INVALID_SOCKET;
}
// 释放掉所有的IO上下文数据
for( int i=0;i<m_arrayIoContext.GetCount();i++ )
{
delete m_arrayIoContext.GetAt(i);
}
m_arrayIoContext.RemoveAll();
}
// 获取一个新的IoContext
_PER_IO_CONTEXT* GetNewIoContext()
{
_PER_IO_CONTEXT* p = new _PER_IO_CONTEXT;

m_arrayIoContext.Add( p );

return p;
}
// 从数组中移除一个指定的IoContext
void RemoveContext( _PER_IO_CONTEXT* pContext )
{
ASSERT( pContext!=NULL );

for( int i=0;i<m_arrayIoContext.GetCount();i++ )
{
if( pContext==m_arrayIoContext.GetAt(i) )
{
delete pContext;
pContext = NULL;
m_arrayIoContext.RemoveAt(i);
break;
}
}
}
} PER_SOCKET_CONTEXT, *PPER_SOCKET_CONTEXT;


提示的错误信息如下:
:error C2976: 'CArray' : too few template arguments
d:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h(238) : see declaration of 'CArray'
: error C2079: 'm_arrayIoContext' uses undefined class 'CArray<struct _PER_IO_CONTEXT *>'

这是为什么啊??
...全文
171 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyhz365 2013-12-26
  • 打赏
  • 举报
回复
楼主好,我也在学习完成端口,也是V6平台,不知道楼主这个完全编译过没有!我的问题太多了!楼主可否把VC6下完整编译的代码发我一下, xyhz365@163.com,望能指教!
夫人的泡泡鱼 2013-10-28
  • 打赏
  • 举报
回复
CArray<_PER_IO_CONTEXT*,_PER_IO_CONTEXT*> m_arrayIoContext; 这样解决了,谢谢,楼上们
worldy 2013-10-26
  • 打赏
  • 举报
回复
CArray需要有两个模版参数,一般形式为 CArray<classA,classA&>ar;
worldy 2013-10-26
  • 打赏
  • 举报
回复
CArray< PER_IO_CONTEXT *,PER_IO_CONTEXT & > m_arrayIoContext
夫人的泡泡鱼 2013-10-26
  • 打赏
  • 举报
回复
CArray< _PER_IO_CONTEXT * > m_arrayIoContext; // 客户端网络操作的上下文数据,也就是说对于每一个客户端Socket,是可以在上面同时投递多个IO请求的 // 初始化 这句出错的…… 一个参数编译不通过,悲剧,2010中可以,6.0中却不行
真相重于对错 2013-10-26
  • 打赏
  • 举报
回复
那一句出错? Ps: template < class TYPE, class ARG_TYPE = const TYPE& > CArray 也可以用一个模版参数,因为第二个有默认值
夫人的泡泡鱼 2013-10-26
  • 打赏
  • 举报
回复
CArray<_PER_IO_CONTEXT*,_PER_IO_CONTEXT&> m_arrayIoContext; 这样解决了,谢谢,楼上们

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧