套接字 一段程序求讲授

套接字 一段程序求讲解
DWORD WINAPI RecvThreadProc(LPVOID pParam)
{
int nretval;
long lType, lLength;
char buffer[1200];
char headbuf[sizeof(long) * 2];
CSK008Dlg *pDlg = (CSK008Dlg*)pParam; //???
while(1)
{
nretval = recv(pDlg->m_hSocket, headbuf, sizeof(long) * 2, 0);
if(nretval != sizeof(long) * 2)
{
AfxMessageBox("您已与服务器断开连接!");
break;
}
else
{
lType = *(long*)headbuf;
lLength = *(long*)(headbuf + sizeof(long));
if(lType != MH_TYPE || lLength >= 1024 )
{
AfxMessageBox("您已与服务器断开连接!");
break;
}
}
nretval = recv(pDlg->m_hSocket, buffer, lLength, 0);
buffer[nretval] = '\0';
pDlg->SendMessage(MSG_ADDTEXT, NULL, (LPARAM)buffer);
}
closesocket(pDlg->m_hSocket);
return 0L;
}

一个接受数据的线程
CSK008Dlg *pDlg = (CSK008Dlg*)pParam;
lType = *(long*)headbuf;
lLength = *(long*)(headbuf + sizeof(long));
if(lType != MH_TYPE || lLength >= 1024 ) 
这几句都是什么作用

------解决方案--------------------
CSK008Dlg *pDlg = (CSK008Dlg*)pParam;//接收从创建线程那里传进来的参数
lType = *(long*)headbuf;//强制类型转换
lLength = *(long*)(headbuf + sizeof(long));
if(lType != MH_TYPE || lLength >= 1024 ) //MH_TYPE 应该这个宏定义,在某处定义了

------解决方案--------------------
pParam是此线程的参数,储存对话框对象的地址,第一句就是把这个地址赋给新建的对话框指针。
lType,lLength应该是自定义协议的协议头内容,if语句就是根据收到的协议头对其解析
------解决方案--------------------
CSK008Dlg *pDlg = (CSK008Dlg*)pParam;
//把界面线程的指针传入接收数据的线程, 目的是为了在线程中控制变量

lType = *(long*)headbuf;
headbuf是指针,强转(long*),然后* 是取值,目的是知道headbuf指向地址的值

lLength = *(long*)(headbuf + sizeof(long));
同上这个length无意义啊

这里的验证我感觉貌似有点问题。



------解决方案--------------------
首先接受包头,sizeof(long)*2个字节。
包头包含2部分信息:
一个是数据类型占sizeof(long)个字节
一个是包体的长度占sizeof(long)个字节

lType = *(long*)headbuf; 取前面sizeof(long)字节值 等价于memcpy
lLength = *(long*)(headbuf + sizeof(long)); 取后面sizeof(long)字节值