设为首页 加入收藏

TOP

11.2.2 功能实现(1)
2013-10-07 13:02:46 来源: 作者: 【 】 浏览:78
Tags:11.2.2 功能 实现

11.2.2  功能实现(1)

在本节中,将向用户讲解服务器端以及客户端的各个功能函数的实现方法。在这些功能函数中,对数据结构的使用同样也是非常重要的一个知识点。

1.服务器功能实现

首先,当服务器启动时会在指定端口等待客户端的连接。如果连接成功,则将在服务器端列表控件中显示客户端的相关信息。代码如下:

  1. void CData::bind()  
  2. {  
  3.     WSADATA data;           //定义结构体变量  
  4.    CString name;            //定义主机名字符串  
  5.     DWORD ss=MAKEWORD(2,0); //指定套接字版本  
  6.    ::WSAStartup(ss,&data);  //初始化套接字库  
  7.    s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
  8.         //创建套接字  
  9.    sockaddr_in addr;        //定义地址结构变量  
  10. ::gethostname((char*)&name,(int)sizeof(name));  //获得主机名字  
  11.     hostent *p=::gethostbyname((char*)&name);   //从主
    机名获取主机地址  
  12.      in_addr *a=(in_addr*)*p->h_addr_list;      //获得
    本机IP地址  
  13.      CString str14=::inet_ntoa(a[0]);           //转
    换字符串IP地址  
  14.    addr.sin_family=AF_INET; //填充地址结构  
  15.     addr.sin_port=htons(80);//指定监听端口为80  
  16.     addr.sin_addr.S_un.S_addr=inet_addr(str14);//指定主机IP地址  
  17.     ::bind(s,(sockaddr*)&addr,sizeof(addr));    //将
    本地信息绑定到套接字  
  18.     ::listen(s,5);          //监听  
  19. WSAAsyncSelect(s,this->m_hWnd,WM_SOCK,FD_ACCEPT|FD_READ);  
  20.         //将套接字设置为异步模式  

在程序中,用户使用函数gethostname()获取本地主机名,并且通过该主机名得到相应的IP地址信息。再将本地主机的相关信息绑定到创建的套接字上,并将该套接字设置为异步模式。

注意:在本节中向用户讲解的各个功能函数均为自定义类CData的成员函数。关于该类的具体封装方法将在11.2.3节中具体讲解。

然后,用户在程序中必须定义与套接字消息相应的响应函数,并且使用消息映射宏将套接字消息WM_SOCK与其响应函数相关联才能实现套接字的异步模式。用户为套接字消息添加消息映射,代码如下:

  1. BEGIN_MESSAGE_MAP(CQQDlg, CDialog)  
  2.     //{{AFX_MSG_MAP(CQQDlg)  
  3.     ON_WM_SYSCOMMAND()  
  4.     ON_WM_QUERYDRAGICON()  
  5.     ...             //省略部分消息映射项  
  6.     ON_MESSAGE(WM_SOCK,Onsoc)           //套接字消息映射  
  7.     ON_WM_CTLCOLOR()  
  8.     ON_WM_TIMER()  
  9.     ON_WM_LBUTTONDOWN()  
  10.     //}}AFX_MSG_MAP  
  11. END_MESSAGE_MAP() 

在消息映射宏中,用户可以看到与套接字消息相关联的函数是Onsoc()。该函数的声明代码如下:

  1. class CQQDlg : public CDialog  
  2. {  
  3. public:  
  4.      ...        //省略部分代码  
  5. afx_msg void Onsoc(WPARAM wParam,LPARAM lParam);    //声
    明套接字消息响应函数  

用户对套接字消息响应函数声明以后,便可以在程序中实现该函数。代码如下:

  1. int i=0;//定义全局变量  
  2. qqstruct qq;                //定义结构体qqstruct变量  
  3. qqmsg msg[5];               //定义结构体qqmsg变量  
  4. void CQQDlg::Onsoc(WPARAM wParam,LPARAM lParam)  
  5. {  
  6.     switch (lParam)         //判断套接字事件  
  7. {  
  8.        case FD_ACCEPT:      //套接字连接事件  
  9.             {  
  10.         msg[i].s=::accept(s,NULL,NULL);     //保存
    客户端连接时返回的套接字  
  11.           if(i<5)           //判断连接的客户端是否已满  
  12. {  
  13. i+=1;  
  14.    }  
  15. else  
  16. {  
  17. i=0;  
  18. }  
  19.             }  
  20.             break;  
  21.         case FD_READ:       //套接字读取事件  
  22.                {  
  23.             recv(msg[i].s, msg[i].qq,sizeof(msg[i].qq),NULL);  
  24.         //接收相应套接字上的消息  
  25. int nRow=m_list.InsertItem(m_list.GetItemCount()+1, 
    msg[i].qq.m_name);  
  26.         //向列表控件中插入行数据  
  27. m_list.SetItemText(nRow,1, msg[i].qq .m_addr);  //设置数据  
  28.               }  
  29.             break;  
  30.         default:  break;  
  31. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇11.2.2 功能实现(2) 下一篇11.1 界面设计

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: