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;
}
}
}
主要代码如下:
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;
}
}
}
解决方案 »
- VS2005加载msvcr80d.dll,VS2008加载msvcr90d.dll,VS2008的解决方案2005打开加载哪个?
- 如何动态识别是哪个具体类。
- 这个几个函数干什么用的?
- 无线网络编程~有做过的人吗?
- 如何将一个工程的对话框界面放到另一个对话框工程中去?
- 急啊!Cwnd类的create函数创建窗口问题!
- 初学者问题:对话框的类选择是基于CDialog或是CFormView有什么区别?
- 请问大家怎样为列表框加标题啊?
- mapviewofile的作用是干什么?
- 我下载了MP3ENC-MP3播放OCX控件,由于有播放时间限制,必须使用注册机,我虽有但却不知该如何使用,请问有谁使用过?
- 调查
- 请教:如何实现图象控件中图象的放大缩小功能
创建之前初始化一下!
创建之前初始化一下
---------------------
已经初始化了,主贴中已经贴出来了,你没注意看调试,跟踪
-----------------------
release版如何跟踪呢?
{
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处理的长度注意一下
SendMessage(pCBillClientApp-> m_hWnd,pCBillClientApp-> m_uCmd,(WPARAM)recvBuf,0);