您的位置:程序门 -> vc/mfc -> 网络编程



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


socket客户端,主线程中connect和send,另开一个线程专用于recv,debug版一切正常,但release版recv得不到正确的数据[已结贴,结贴人:hanchong]
发表于:2007-12-28 17: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;
}
}
}
发表于:2007-12-28 18:10:301楼 得分:0
m_sock       =       socket(af_inet,sock_stream,ipproto_tcp);  
创建之前初始化一下!
发表于:2007-12-28 18:24:112楼 得分:0
调试,跟踪
发表于:2008-01-04 14:26:293楼 得分:0
m_sock               =               socket(af_inet,sock_stream,ipproto_tcp);      
创建之前初始化一下
---------------------
已经初始化了,主贴中已经贴出来了,你没注意看


调试,跟踪
-----------------------
release版如何跟踪呢?
发表于:2008-01-04 16:45:224楼 得分:10
你release有问题的话     一定是有什么变量没有初始化的   这是不用想的。       debug会自动给你初始化变量而release不会
发表于:2008-01-04 17:29:175楼 得分:0
生成pdb符号文,然后用windbg运行程序,可以调试的
发表于:2008-01-04 17:33:266楼 得分:10
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处理的长度注意一下
发表于:2008-01-04 22:32:267楼 得分:0
强烈不建议用消息传递数据,我以前有过类似的经历,你用指针传递数据看看
sendmessage(pcbillclientapp->   m_hwnd,pcbillclientapp->   m_ucmd,(wparam)recvbuf,0);  
发表于:2008-01-06 10:46:178楼 得分:0
问题已解决,是packetin中的data与datalen变量没有初始化,在构造函数中初始化后正常.
发表于:2008-01-06 10:51:599楼 得分:0
结束


快速检索

最新资讯
热门点击