Socket客户端,主线程中connect和send,另开一个线程专用于recv,debug版一切正常,但release版recv得不到正确的数据

hanchong 2007-12-28 05:33:16
Socket客户端,主线程中connect和send,另开一个线程专用于recv,debug版一切正常,但release版recv得不到正确的数据,但我用抓包工具看到的数据明明是正常的,和debug版时一样,就是release的recv获取不到这个数据.
主要代码如下:


bool CBillClientApp::ConnectToServer()
{
sockaddr_in m_addr;

if(m_sock != NULL)
{
closesocket(m_sock);
m_sock = NULL;
}

if(m_sock == NULL)
{
m_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
}

m_addr.sin_family = AF_INET;
m_addr.sin_addr.s_addr = inet_addr(m_sIP);
m_addr.sin_port = htons(m_uPort);

int ret = 0;
ret = connect(m_sock, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR)
{
printf("连接失败");
closesocket(m_sock);
//WSACleanup();
return false;
}


CWinThread *g_Thread = new CWinThread((AFX_THREADPROC)ThreadServer,(LPVOID)(this));
if(!g_Thread->CreateThread())
{
CloseConnect();
return false;
}



return true;
}

//与服务器端连接线程,侦听服务器返回的消息
DWORD ThreadServer(LPDWORD lpdWord)
{
CBillClientApp *pCBillClientApp = (CBillClientApp *)lpdWord;
while(1)
{
PacketIN *recvBuf = new PacketIN();
int RecLen;
RecLen = recv(pCBillClientApp->m_sock,recvBuf->data,MAX_PACKET_SIZE,0);

if(RecLen > 1)
SendMessage(pCBillClientApp->m_hWnd,pCBillClientApp->m_uCmd,(WPARAM)recvBuf,0);
else
{
closesocket(pCBillClientApp->m_sock);
return 0;
}
}
}
...全文
199 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanchong 2008-01-06
  • 打赏
  • 举报
回复
结束
hanchong 2008-01-06
  • 打赏
  • 举报
回复
问题已解决,是PacketIN中的data与datalen变量没有初始化,在构造函数中初始化后正常.
mr.zhoux 2008-01-04
  • 打赏
  • 举报
回复
强烈不建议用消息传递数据,我以前有过类似的经历,你用指针传递数据看看
SendMessage(pCBillClientApp-> m_hWnd,pCBillClientApp-> m_uCmd,(WPARAM)recvBuf,0);
jourbin 2008-01-04
  • 打赏
  • 举报
回复
DWORD ThreadServer(LPDWORD lpdWord)
{
CBillClientApp *pCBillClientApp = (CBillClientApp *)lpdWord;
while(1)
{
PacketIN *recvBuf = new PacketIN();
int RecLen;
RecLen = recv(pCBillClientApp-> m_sock,recvBuf-> data,MAX_PACKET_SIZE,0);

if(RecLen > 1)
SendMessage(pCBillClientApp-> m_hWnd,pCBillClientApp-> m_uCmd,(WPARAM)recvBuf,0);
else
{
closesocket(pCBillClientApp-> m_sock);
return 0;
}
}
}

你在pCBillClientApp-> m_uCmd的消息处理函数里面,对recvBuf-> data处理的长度注意一下
ouyh12345 2008-01-04
  • 打赏
  • 举报
回复
生成pdb符号文,然后用windbg运行程序,可以调试的
jilei1983 2008-01-04
  • 打赏
  • 举报
回复
你release有问题的话 一定是有什么变量没有初始化的 这是不用想的。 debug会自动给你初始化变量而release不会
hanchong 2008-01-04
  • 打赏
  • 举报
回复
m_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
创建之前初始化一下
---------------------
已经初始化了,主贴中已经贴出来了,你没注意看



调试,跟踪
-----------------------
release版如何跟踪呢?
jourbin 2007-12-28
  • 打赏
  • 举报
回复
调试,跟踪
wjohenw 2007-12-28
  • 打赏
  • 举报
回复
m_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
创建之前初始化一下!

18,363

社区成员

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

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