100分请教一个函数流程问题 问了一个周了还没人回答啊。。

Terryjia 2008-12-01 09:15:47
客户端给服务器发一条登陆命令(自定义的协议),服务器收到后给客户端一个返回命令(也是自定义的)
客户端在收到返回以后的命令判断登陆结果。客户端使用的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;
}
...全文
487 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Terryjia 的回复:]
我整个程序还有好多别的功能 可以一部分用同步的 一部分用异步的吗?还是同步的都能解决问题。。现在只明白阻塞与非阻塞的区别
同步异步的区别还没理解透。。当然 能用异步解决这一问题最好了 谢谢大家了
[/Quote]
可以一部分同步,一部分异步。
yaozhu88 2008-12-04
  • 打赏
  • 举报
回复
都是高手啊
Terryjia 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qiandayong 的回复:]
LOGIN完了就完了, 就别管了

再加一个IsSuccess, 根据返回的内容判断是否成功不就行了
[/Quote]
那样在LOGIN里面出现的错误就无法判断了。。。能不能在写一个函数把LOGIN和CHECK2个函数包起来。。
还没淹死的鱼 2008-12-03
  • 打赏
  • 举报
回复
LOGIN完了就完了, 就别管了

再加一个IsSuccess, 根据返回的内容判断是否成功不就行了
WheatField 2008-12-02
  • 打赏
  • 举报
回复
或者把你的窗口HANDLE作为参数传入LOGiN, 从你的DLL中向你的调用程序发消息
或者用回调函数。

既然在你的登陆过程中不做别的事情,为何不用同步?
Terryjia 2008-12-02
  • 打赏
  • 举报
回复
我整个程序还有好多别的功能 可以一部分用同步的 一部分用异步的吗?还是同步的都能解决问题。。现在只明白阻塞与非阻塞的区别
同步异步的区别还没理解透。。当然 能用异步解决这一问题最好了 谢谢大家了
猞猁狲 2008-12-02
  • 打赏
  • 举报
回复
我感觉和这个接口没有多大关系啊?

你的DLL里只是负责检测是否收到服务器的消息!

你应该有一个登录窗体!一直处于未登录状态,当你发送请求后你就什么也别做,当选择模型收到服务器反馈后在OnSockMessage里

PostMessage到登录窗口,把服务器反馈信息也Post过去,然后登录窗口映射你的Post的消息,调用响应函数,函数内部根据服务器

反馈的信息再调用你DLL里login函数,判断是否Login
玉古云投 2008-12-01
  • 打赏
  • 举报
回复
路过 Up
cnzdgs 2008-12-01
  • 打赏
  • 举报
回复
你现在需要调用Login函数来登录,并返回结果,这种情况函数中应该用阻塞方式来实现。
Terryjia 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
WSAAsyncSelect是基于消息的异步工作模式,而你现在要定义一个同步函数,这两者是相互矛盾的。当然也不是没法实现,只是很别扭。
[/Quote]

有什么方法啊?常规方法是什么那?这种需求应该不少把。。。我试过用线程的方法还有waitforsingleobject都不行。。
cnzdgs 2008-12-01
  • 打赏
  • 举报
回复
WSAAsyncSelect是基于消息的异步工作模式,而你现在要定义一个同步函数,这两者是相互矛盾的。当然也不是没法实现,只是很别扭。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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