CTalkDlg* pTalk; //发送消息的对话框指针
CLookDlg* pRecv; //查看消息的对话框指针
CFriendDetailDlg* pFInfo; //查看详细资料对话框的指针
};
传给发送线程的参数数据结构:
struct sparam
{
CData* pData; 需要发送的数据的指针
CWnd*pWnd; 接受反馈消息的窗口
CClientSocket* pSocket; 客户端socket的指针
};
全局函数申明:
UINT RequestFriendDetail(LPVOID param);
查询所有好友的详细信息是否完全,若没有详细信息,则以一定的时间间隔,向服务器发送没有详细信息的好友的请求信息。此工作线程函数,在上线或隐身后,N秒后将开始执行,然后每隔K秒就向服务器发送请求信息,在后台处理。原则是,把每个好友详细信息取回,又不影响前台用户的操作。
UINT SendThread(LPVOID param);
在线程里发送数据的函数
§4.6服务器端的底层通讯类的设计
为了使能及时响应用户的请求,当用户很多时,仍然能够适应要求,我把侦听与发送数据的Socket分开,并分别都建立了多个实例,
也就是说,支持多个端口的侦听,发送数据使用的是多个端口,我只对侦听端口感兴趣,对发送数据的端口不感兴趣,因为,发送端口是多少都无所谓。
CRecvSocket和CsendSocket都是从CAsyncSocket类里继承而来,分别处理侦听请求各发送数据,在CServerSocket类里,定义了几个CRecvSocket和CSendSocket对象的实例,通过CServerSocket类对内部进行组织和管理,提供给上层的接口是CServerSocket,它隐藏了服务器底层通讯的细节及多线程发送数据的问题,提供给上一层一个统一的接口,CServerSocket类的使用,是先建立一个它的实例,再调用成员函数Create(),传入必要的参数,发送数据时,就调用其成员函数SendData,处理接受数据,在CRecvSocket类的OnReceive里处理,调用了一个名为ProcessRecvData的线程函数,用户在这个线程函数里写上具体的处理代码
算法描述:
发送一个数据,需要等待响应信息的回来,如果在规定时间内,还没有收到确认信息,则认为发送数据丢失,将重试FailReDoTime次,如果还是没有确认信息发送回来,则返回发送失败,否则,返回发送成功。
因为服务器是多线程的发送数据,有一个请求,就建立一个线程进行处理。我为每个发送socket设置一个是否忙的标志busy,当需要发送数据时,就选择一个空闲的sendsocket,设置为忙,然后发送数据,再设置回空闲,然后等待确认信息的回来。
SendData函数的实现算法,通过设置一个缓冲区长度为N,然后,为每一次数据进行统计,发一次,就加1,然后把发送数据中的This=count%N,且把缓冲区中第This个成员设为0,在发送端,就要数组中的第This个成员是否为1即可,在接受到的确认信息中,取出This项,再为缓冲区中第This项设为1,这样就可以快速且可靠的判断发送数据是否得到响应回来了。
侦听类结构:
class CRecvSocket : public CAsyncSocket
{
private:
char m_szResponseMsg[MaxResponseMsgLength]; 确认消息串
int m_szrLength; 确认消息串的长度
public:
CRecvSocket();
virtual ~CRecvSocket();
public:
BOOL Create(int nPort); 指定端口号,建立一个侦听Socket
virtual void OnReceive(int nErrorCode); 处理接受数据
};
发送数据的socket类结构
class CSendSocket : public CAsyncSocket
{
private:
BYTE* pBuf;
//指向CServerSocket的m_arBuf缓冲区,处理发送后是否收到确认信息的缓冲区
char m_szResponseMsg[20];
int m_szrLength;
public:
CSendSocket(BYTE*buf);
virtual ~CSendSocket();
BOOL Create(); 建立一个发送的socket
virtual void OnReceive(int nErrorCode); 处理发送数据后接受到的确认消息
};
服务器的socket类
这个通讯类的SendData,当发送数据失败时,可以重发几次,次数可由用户来确定
class CServerSocket
{
public:
void Close();
BOOL Create(int SendSockNum,CArray<DWORD,DWORD>&aPort,int TimeOut= TimeWaitForRes);
//建立侦听Socket和发送Socket,aPort是侦听端口数组,TimeOut是设置发送超时时间
BOOL SendData(CData* pData,int FailReDoTimes=3);
//数据函数,这个函数适合在线程里发送数据函数,而服务器的响应都是在工人线程里完成的,所以,很适合服务器的发送数据。成功返回真,不成功返
首页 上一页 5 6 7 8 9 10 11 下一页 尾页 8/17/17
免费vc++网上寻呼QICQ源代码(附带文档)(八)由毕业论文网(www.huoyuandh.com)会员上传。