//头文件中定义
typedef struct _PER_IO_DATA
{
WSAOVERLAPPED ol; char *buf; // Buffer
int buflen; // Length of the buffer int operation; // Type of operation
#define OP_ACCEPT 0 // AcceptEx
#define OP_READ 1 // WSARecv/WSARecvFrom
#define OP_WRITE 2 // WSASend/WSASendTo
} PER_IO_DATA, * LPPER_IO_DATA;//源文件中
lpPerIoData = new _PER_IO_DATA;
ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));运行到这里时debug看到lpPerIoData->ol的对应项显示:
WSAOVERLAPPED ol;
"CXX0030: Error: expression cannot be evaluated"
哪位帮忙看一下这是为什么呀?这问题已经困扰好长时间了。
谢谢!
typedef struct _PER_IO_DATA
{
WSAOVERLAPPED ol; char *buf; // Buffer
int buflen; // Length of the buffer int operation; // Type of operation
#define OP_ACCEPT 0 // AcceptEx
#define OP_READ 1 // WSARecv/WSARecvFrom
#define OP_WRITE 2 // WSASend/WSASendTo
} PER_IO_DATA, * LPPER_IO_DATA;//源文件中
lpPerIoData = new _PER_IO_DATA;
ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));运行到这里时debug看到lpPerIoData->ol的对应项显示:
WSAOVERLAPPED ol;
"CXX0030: Error: expression cannot be evaluated"
哪位帮忙看一下这是为什么呀?这问题已经困扰好长时间了。
谢谢!
怎么定义的?
typedef struct _PER_IO_DATA
{
OVERLAPPED ol;
char *buf; // Buffer
int buflen; // Length of the buffer int operation; // Type of operation
#define OP_ACCEPT 0 // AcceptEx
#define OP_READ 1 // WSARecv/WSARecvFrom
#define OP_WRITE 2 // WSASend/WSASendTo
} PER_IO_DATA, * LPPER_IO_DATA;
//源文件:LPPER_IO_DATA lpPerIoData = new _PER_IO_DATA;
ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));
看看?
lpPerIoData我当然定义了,否则编译能通过吗?呵呵。
或
memset(&(lpPerIoData->ol),0,sizeof(OVERLAPPED));
------------------------------------------
这个我知道我只是想看看你是怎么定义的.单独看这段程序是看不出什么问题的,
楼主将代码贴详细一点
void CTreeDialog::OnAccept()
{
PER_HANDLE_DATA *PerHandleData = NULL;
LPPER_IO_DATA lpPerIoData;
SOCKADDR_IN saRemote;
SOCKET Accept;
int RemoteLen;DWORD RecvBytes = 0;
DWORD Flags;RemoteLen=sizeof(SOCKADDR_IN);Accept=accept(m_sListen, (SOCKADDR*)&saRemote, &RemoteLen);
int i=WSAGetLastError();
if(Accept==INVALID_SOCKET) //若没接收到数据,函数返回
return;//创建用来和套接字关联的单句柄数据信息结构
PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
PerHandleData->socket=Accept;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);//将接受套接字和完成端口关联起来
CreateIoCompletionPort((HANDLE)Accept, m_hCompletionPort, (DWORD)PerHandleData, 0);m_nDvNum++; //设备总数++//开始在接收套接字上处理I/O
//使用重叠I/O
WSABUF wbuf;
Flags = 0;WSAEVENT Event;
char buffer[4096];lpPerIoData = new _PER_IO_DATA; //!!!!ZeroMemory(&(lpPerIoData->ol), sizeof(WSAOVERLAPPED));Event = WSACreateEvent();
lpPerIoData->ol.hEvent = Event;lpPerIoData->buflen=4096;
memcpy(buffer, &"", sizeof(buffer));
lpPerIoData->buf=buffer;wbuf.len = lpPerIoData->buflen;
wbuf.buf = lpPerIoData->buf;lpPerIoData->operation = OP_READ;i = WSARecv(Accept,
&wbuf,
1,
(unsigned long *)&RecvBytes,
&Flags,
&(lpPerIoData->ol),
NULL);
i=WSAGetLastError();
delete lpPerIoData;
}
AfxMessageBox((char*)&(lpPerIoData));
输出字符串不认识,但没有错误。
当运行到WSARecv()时,出现异常错误;将WSARecv()的倒数第二个参数&(lpPerIoData->ol)改写成NULL,则程序正常运行,但这样不是我想要的呀。
我实在是看不出来什么地方错了。
help!
谢谢大家!