100分请教一个函数流程问题 问了一个周了还没人回答啊。。
客户端给服务器发一条登陆命令(自定义的协议),服务器收到后给客户端一个返回命令(也是自定义的)
客户端在收到返回以后的命令判断登陆结果。客户端使用的WSAAsyncSelect模型。
我写的函数流程是这样在一个LOGIN函数里面send,然后从服务器返回命令,被WSAAsyncSelect中的OnSockMessage函数捕获到,
在里面跳到一个判断登陆结果的函数CHECKLOGIN。程序执行正确。
但我现在想把他封装一下,写成一个DLL,接口为BOOL LOGIN(……)。
现在就是不知道如何写这个接口?怎么在执行判断结果后返回LOGIN里面return true or false?
因为LOGIN函数在send完以后就结束了,这个时候的返回值对登陆的判断根本没有用。
贴一部分代码:
void CDF_DemoDlg::ConnectServer(char *sServerIP,WORD wServerPort)
{
//创建转发服务器套接字
socktran = socket(AF_INET,SOCK_STREAM,0);
if (socktran == SOCKET_ERROR)
{
CString sTemp;
sTemp.Format(" error %d", WSAGetLastError());
AfxMessageBox(sTemp);
return;
}
SOCKADDR_IN sockAddr;
sockAddr.sin_addr.S_un.S_addr = inet_addr(sServerIP);
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(wServerPort);
//连接服务器
int iConn = connect(socktran,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));
if (iConn)
{
CString sTemp;
sTemp.Format(" error %d", WSAGetLastError());
AfxMessageBox(sTemp);
return;
}
//异步套接字
int iErrorCode = WSAAsyncSelect(socktran,m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
if (iErrorCode)
{
CString sTemp;
sTemp.Format(" error %d", WSAGetLastError());
AfxMessageBox(sTemp);
return;
}
//填充结构体
LOGIN login;
ZeroMemory(&login,sizeof(LOGIN));
login.head.wSync = SYNCHEAD;
login.head.bFunctionID = 0x01;
login.head.wDataLen = MAKEWORD(0x22,0);
login.modulecode = MAKEWORD(0x02,0);
login.modulestyle = MAKEWORD(TRANSMITSERVER,0);
login.end = ENDCODE;
send(socktran,(char*)&login,sizeof(LOGIN),0);
}
LRESULT CDF_DemoDlg::OnSockMessage(WPARAM wParam, LPARAM lParam)
{
int recvnum;
unsigned char recvbuf[1024];
memset(recvbuf,0,sizeof(recvbuf));
if(WSAGETSELECTERROR(lParam))
{
closesocket(wParam);
}
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
//接受服务器返回数据
recvnum = recv(wParam,(char*)recvbuf,sizeof(recvbuf),0);
JudgeFunction(recvbuf);//判断属于哪种功能码
}
break;
case FD_CLOSE:
{
//关闭套接字
closesocket(wParam);
}
break;
default:
break;
}
return 0L;
}