WEB开发网
开发学院软件开发C++ 服务器与客户机互传消息 阅读

服务器与客户机互传消息

 2008-03-08 12:41:49 来源:WEB开发网   
核心提示:一、 服 务 器 程 序创 建 一 个 名 为“server" 的 项 目, 单 文 档 界 面。 在serverview.h 中 加 入 代 码: #include “winsock.h"添 加 变 量:CSize sizeTotal;// 控 制 滚 动 条int count;// 信 息 条

  一、 服 务 器 程 序
创 建 一 个 名 为“server" 的 项 目, 单 文 档 界 面。
在serverview.h 中 加 入 代 码:
      #include “winsock.h"
   添 加 变 量:
      CSize    sizeTotal;// 控 制 滚 动 条
      int  count;// 信 息 条 数
      CString m_data[1000];// 信 息 存 放
      char  Hostname[260];
      char Hostaddress[20];// 主 机ip 地 址
      SOCKET   m_sock;
      HANDLE   m_hListenThread;// 线 程
      BOOL m_bInitialized;// 是 否 初 始 化
      WSADATA   WSAData;
      BOOL flag;
      SOCKADDR_IN saClnt;
      int  saClntLen;
      BOOL Isconnect;// 是 否 连 接  

在serverview.cpp 中 重 载CServerView() 构 造 器, 创 建 并 绑 定 嵌 套 字:
   CServerView::CServerView()
{   // TODO: add constrUCtion code here
   Isconnect=FALSE;
   flag=FALSE;
   sizeTotal.cy=350;
   sizeTotal.cx=300;
   m_hListenThread;
   count=5;
   int status;
   WSADATA wsaData;
  m_data[0]=“initializing Windows Sockets DLL....";
   if((status=WSAStartup(0x0101, &wsaData))==0)
   {   m_data[0] +=“Succeeded";
      m_bInitialized=TRUE;

   }
   else
   {   m_bInitialized=FALSE;
   }
   m_sock=socket(AF_INET,SOCK_DGRAM,0);
   m_data[1]=“Creating socket....";
   if(m_sock==INVALID_SOCKET)
   {   m_data[1] +=“Failed";
   }
   m_data[1] +=“Succeeded";
   m_data[2]=“Binding socket....";
   sockaddr_in sa;
   sa.sin_family=AF_INET;
   sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
   sa.sin_port=htons(5050);
   if(bind(m_sock,(PSOCKADDR)
   &sa,sizeof(sa))==SOCKET_ERROR)
   {   m_data[2] +=“Failed";
      closesocket(m_sock);
   }
   m_data[2] +=“Succeeded";
   m_data[3]=“Creating listener thread....";
   unsigned long idThread;
m_hListenThread=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)Listen,
(void    if(m_hListenThread)
   {   m_data[3] +=“Succeeded";
      m_data[4] +=“Listening....";
   }
   else
      m_data[4] +=“Failed";
}

在 析 构 函 数 中 完 成 必 需 的 清 除 操 作:
   CServerView:: ~CServerView()
{   if(m_bInitialized)
   WSACleanup();
   closesocket(m_sock);
   if(m_hListenThread)
   ::TerminateThread(m_hListenThread,0);
}   

定 义 接 收 和 处 理 消 息 的 线 程:
   long WINAPI Listen(CServerView *pView)
{   char msg[2000]=“";

   int  nchar;
   SOCKADDR_IN saClnt;
   int saClntLen;
   while(1)
   { saClntLen=sizeof(saClnt);
    nchar=recvfrom(pView ->m_sock,msg,1024,0,
(PSOCKADDR) &saClnt, &saClntLen);
    if(nchar<0)
    {   pView ->m_data[pView ->count + +] +
       =“Error in recvfrom\n";
    pView ->InvalidateRect(NULL);
    }
    else
    {switch(msg[0])
    {
    case ‘A':
    wsPRintf(msg,“A:Client from %s attached\n",
        inet_ntoa(saClnt.sin_addr));
    pView ->m_data[pView ->count + +]=msg;
    pView ->flag=TRUE;
    pView ->InvalidateRect(NULL);
    pView ->Isconnect=TRUE;
    pView ->saClnt=saClnt;
    pView ->saClntLen=saClntLen;
    sendto(pView ->

Tags:服务器 客户机 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接