我的年中考核任务:求下面的重叠通讯代码,为何回调函数里打断点无法进入?

jyzdtn 2011-08-31 10:24:16
#include "stdafx.h"
#include <WinSock2.h>
#include <iostream>
#include "heartbeat.h"
#include "ManageMessage.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std;
VOID WINAPI RecvCompletionRoutine(DWORD dwError,DWORD cbTransferred,
LPWSAOVERLAPPED lpOverlapped,DWORD dwFlags)
{
cout<<"RecvCompletionRoutine start"<<endl;
LPWSASRDATA overlapp = (LPWSASRDATA)lpOverlapped;

overlapp->pucmanage.manageMesg(overlapp->buffer);

if (WSARecv(overlapp->socket,&(overlapp->buffer),1,&(overlapp->NumberOfBytesSRd),&(overlapp->Flags),&static_cast<WSAOVERLAPPED&>(*overlapp),RecvCompletionRoutine) != 0)
{
cout<<"WSARecv failed GetLastError = "<<GetLastError()<<endl;
return ;

}


};
VOID WINAPI SendCompletionRoutine(DWORD dwError,DWORD cbTransferred,
LPWSAOVERLAPPED lpOverlapped,DWORD dwFlags)
{

}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA lpData;
WORD lpVersion = MAKEWORD(2,2);
SOCKET ulsocksend;
int port = 3000;
struct sockaddr_in ser;
char buff[MAXRECVLEN];
memset(buff,0,sizeof(buff));
LPWSASRDATA pucRecvData = NULL;
LPWSASRDATA pucSendData = NULL;
pucRecvData = new WSASRDATA;
pucSendData = new WSASRDATA;
if (pucRecvData == NULL||pucSendData == NULL)
{
return 1;
}
memset(pucRecvData,0,sizeof(WSASRDATA));
memset(pucSendData,0,sizeof(WSASRDATA));
if (WSAStartup(lpVersion,&lpData) != 0 )
{
cout<<"WSAStartup failed";
return 0;
}
if (lpData.wVersion != lpVersion)
{
cout<<"winsock version is not matching"<<endl;
return 0;
}
ulsocksend = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,NULL,WSA_FLAG_OVERLAPPED);
if (ulsocksend == INVALID_SOCKET)
{
cout<<"socket create failed"<<endl;
return 0;
}
ser.sin_family = AF_INET;
ser.sin_addr.s_addr = inet_addr("127.0.0.1");
ser.sin_port = htons(port);
int ret = connect(ulsocksend,(const sockaddr*)&ser,sizeof(ser));
if (ret == SOCKET_ERROR)
{
int error = WSAGetLastError();
cout<<"connect failed,GetLastError is ="<<error<<endl;
return 0;
}
cout<<"connect IP="<<inet_ntoa(ser.sin_addr)<<"PORT="<<ntohs(ser.sin_port)<<endl;
pucRecvData->socket = ulsocksend;
pucRecvData->buffer.buf = buff;
pucRecvData->buffer.len = MAXRECVLEN;
...全文
134 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
软刀 2011-09-07
  • 打赏
  • 举报
回复
debug的时候
如果要进去某个函数里
是step into 不是step over
不知道这点有木有注意到。。。
wykqhyjs 2011-09-07
  • 打赏
  • 举报
回复
还没解决,,,求助
jyzdtn 2011-09-02
  • 打赏
  • 举报
回复
ding
jyzdtn 2011-09-02
  • 打赏
  • 举报
回复
ding
jyzdtn 2011-09-01
  • 打赏
  • 举报
回复
ding
jackyjkchen 2011-08-31
  • 打赏
  • 举报
回复
我日……还有没贴完的
jackyjkchen 2011-08-31
  • 打赏
  • 举报
回复
搜了下关键字RecvCompletionRoutine,你这个回调函数自己回调自己,能调得动么,总得有个触发回调的入口吧……
jyzdtn 2011-08-31
  • 打赏
  • 举报
回复
while (1)
{
int ulRet = WSARecv(ulsocksend,&(pucRecvData->buffer),1,&(pucRecvData->NumberOfBytesSRd),&(pucRecvData->Flags),&static_cast<WSAOVERLAPPED&>(*pucRecvData),RecvCompletionRoutine);
// if (ulRet != 0)
// {
cout<<"WSARecv failed GetLastError = "<<GetLastError()<<endl;
//return 0;
/*}*/
int puRet = WSASend(ulsocksend,&(pucSendData->buffer),1,&(pucSendData->NumberOfBytesSRd),pucSendData->Flags,&static_cast<WSAOVERLAPPED&>(*pucSendData),SendCompletionRoutine);
if (puRet != 0)
{
cout<<"WSASend failed GetLastError = "<<GetLastError()<<endl;
return 0;
}

}
WSACleanup();
delete []pucRecvData;
delete []pucSendData;
return 0;
}

至善者善之敌 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luciferisnotsatan 的回复:]
引用 5 楼 luciferisnotsatan 的回复:

void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);

MSDN里原型写的是CALLBACK

好像没啥关系,#d……
[/Quote]

同问,并帮顶
luciferisnotsatan 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]

void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);

MSDN里原型写的是CALLBACK
[/Quote]
好像没啥关系,#define都是一样的。
WSARecv这个函数执行是否成功?
luciferisnotsatan 2011-08-31
  • 打赏
  • 举报
回复
void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);

MSDN里原型写的是CALLBACK
jyzdtn 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]
搜了下关键字RecvCompletionRoutine,你这个回调函数自己回调自己,能调得动么,总得有个触发回调的入口吧……
[/Quote]
恩啊 ,帮忙分析下啊 兄弟

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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