⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverdlg.cpp

📁 本书通过实例介绍了嵌入式编程的方法与技巧书中例子具有实用性
💻 CPP
📖 第 1 页 / 共 2 页
字号:
if(m_iNextFree >= m_iMaxConnects)
{
  if(HeapAlloc(m_hConnectHeap, 0, sizeof(VTSOCKET) * 5) == NULL)
  { 
    return 0L;
  }
  m_iMaxConnects += 5;  
}
index = 0;
while(m_lpServSocks[index].m_hSock != wparam) 
index++;
m_lpServSocks[index].m_iStatus = VTSOCKET_ACCEPTING;
addrlen = sizeof(m_lpClientSocks[m_iNextFree].m_sockAddr) + 
           sizeof(m_lpClientSocks[m_iNextFree].m_Reserved);
if ((m_lpClientSocks[m_iNextFree].m_hSock = 
     accept(m_lpServSocks[index].m_hSock, 
     &m_lpClientSocks[m_iNextFree].m_sockAddr,&addrlen)) == INVALID_SOCKET)
{
   AfxMessageBox("Cannot accept the client socket");
   return 0L;
}
if(WSAAsyncSelect(m_lpClientSocks[m_iNextFree].m_hSock,
  this->GetSafeHwnd(), VTM_DATAREADY, FD_READ | FD_CLOSE)== SOCKET_ERROR)
{
  closesocket(m_lpClientSocks[m_iNextFree].m_hSock);
  AfxMessageBox("Cannot select the client socket");
  return 0L;
}
m_lpClientSocks[m_iNextFree].m_iProtocol = 
                                      m_lpServSocks[index].m_iProtocol;
m_lpClientSocks[m_iNextFree].m_iSockType = 
                                      m_lpServSocks[index].m_iSockType;
m_lpClientSocks[m_iNextFree].m_iServSockIndex = index;
m_lpClientSocks[m_iNextFree++].m_iStatus = VTSOCKET_CONNECTED;
m_lpServSocks[index].m_iConnects ++;
m_lpServSocks[index].m_iStatus = VTSOCKET_LISTENING;
UpdateProtList(index);
return 1L;
}
LONG CServerDlg::OnVTDataReady(WPARAM wparam, LPARAM lparam)
{
int iIndex1; 
int iIndex2; 
int iIndex3; 
int byteRead;
int iStrLen;
for(iIndex1 = 0; iIndex1 < m_iNextFree; iIndex1++)
{
   if((m_lpClientSocks[iIndex1].m_hSock == wparam) &&  
       (m_lpClientSocks[iIndex1].m_iStatus != VTSOCKET_CLOSED))
          break;
}
if(LOWORD(lparam) == FD_CLOSE)
{
  closesocket(m_lpClientSocks[iIndex1].m_hSock);
  UpdateClientList(m_lpClientSocks[iIndex1].m_sUserName,VTSOCKET_CLOSED, 
                    NULL);
  if(m_lpClientSocks[iIndex1].m_iStatus == VTSOCKET_AVAILABLE)
  {
    DeRegisterClient(m_lpClientSocks[iIndex1].m_sUserName);
  }
// First, find peer
for(iIndex2 = 0; iIndex2 < m_iNextFree; iIndex2++)
 {
 if((m_lpClientSocks[iIndex2].m_hSock==lpClientSocks[iIndex1].m_hPeerSock) 
      &&(m_lpClientSocks[iIndex2].m_iStatus == VTSOCKET_INSESSION))
 {
    break;
 }
}
if(iIndex2 < m_iNextFree)  
{
   m_vtMsgBuf->m_ucIdentity = VT_IDENTITY;
   m_vtMsgBuf->m_ucMsgType = VT_TEXT;
   m_vtMsgBuf->m_lLength = byteRead = SIZEVTMSGHDR;
   m_vtMsgBuf->m_ucCmd = VTCMD_SESSIONCLOSE;
  SendVTMessage(m_lpClientSocks[iIndex2].m_hSock, m_vtMsgBuf);
  // Update client's displayed status
  m_lpClientSocks[iIndex2].m_iStatus = VTSOCKET_AVAILABLE;
  UpdateClientList(m_lpClientSocks[iIndex2].m_sUserName, 
                    VTSOCKET_AVAILABLE, NULL);
  for(iIndex3 = 0; iIndex3 < m_iNextFree; iIndex3++)
  {
    if ((iIndex3 != iIndex2) && 
        (m_lpClientSocks[iIndex3].m_iStatus == VTSOCKET_AVAILABLE))
    {
       m_vtMsgBuf->m_ucCmd = VTCMD_REGNAME;
       memcpy((void*)m_vtMsgBuf->m_pData,         
               (void*)m_lpClientSocks[iIndex3].m_sUserName, 
               REALLEN(m_lpClientSocks[iIndex3].m_sUserName)*sizeof(char));
      m_vtMsgBuf->m_lLength = REALLEN 
                     (m_lpClientSocks[iIndex3].m_sUserName) + SIZEVTMSGHDR;
      SendVTMessage(m_lpClientSocks[iIndex2].m_hSock, m_vtMsgBuf);
      memcpy((void*)m_vtMsgBuf->m_pData,
              (void*)m_lpClientSocks[iIndex2].m_sUserName,
              REALLEN(m_lpClientSocks[iIndex2].m_sUserName)*sizeof(char));
             m_vtMsgBuf->m_lLength = 
             EALLEN(m_lpClientSocks[iIndex2].m_sUserName)+ SIZEVTMSGHDR;
            SendVTMessage(m_lpClientSocks[iIndex3].m_hSock, m_vtMsgBuf);
    }
}
}
m_lpClientSocks[iIndex1].m_iStatus = VTSOCKET_CLOSED;
iIndex2 = m_lpClientSocks[iIndex1].m_iServSockIndex;
m_lpServSocks[iIndex2].m_iConnects --;
UpdateProtList(iIndex2);
return 1L;
}
if(!RecvVTMessage(&m_lpClientSocks[iIndex1], m_vtMsgBuf))
{
   return 0L;
}
switch(m_vtMsgBuf->m_ucCmd)
{
case VTCMD_REGNAME:  
   if(m_lpClientSocks[iIndex1].m_iStatus != VTSOCKET_CONNECTED)
   {
     AfxMessageBox("The client not connected"); 
     return 0L;
   }
  iStrLen = m_vtMsgBuf->m_lLength - SIZEVTMSGHDR; 
  memcpy((void*)m_lpClientSocks[iIndex1].m_sUserName, 
         (void*)m_vtMsgBuf->m_pData, iStrLen+1);
   m_lpClientSocks[iIndex1].m_iStatus = VTSOCKET_AVAILABLE;
   UpdateClientList(m_lpClientSocks[iIndex1].m_sUserName, 
                  VTSOCKET_AVAILABLE, NULL);
    // Send notification to other "AVAILABLE" sockets that 
    // a new peer is available
   for(iIndex2 = 0; iIndex2 < m_iNextFree; iIndex2++)
   {
     if ((iIndex2 != iIndex1) && (m_lpClientSocks[iIndex2].m_iStatus == 
            VTSOCKET_AVAILABLE))
     {
        SendVTMessage(m_lpClientSocks[iIndex2].m_hSock, m_vtMsgBuf);
     }
   }
   // Send notifications back to registering client of 
   // all the currently available clients
 for(iIndex2 = 0; iIndex2 < m_iNextFree; iIndex2++)
 {
   if ((iIndex2 != iIndex1) && (m_lpClientSocks[iIndex2].m_iStatus == 
         VTSOCKET_AVAILABLE))
   {
     m_vtMsgBuf->m_ucCmd = VTCMD_REGNAME;
     m_vtMsgBuf->m_ucMsgType = VT_TEXT;                    
     m_vtMsgBuf->m_lLength = REALLEN(m_lpClientSocks[iIndex2].m_sUserName)
                              + SIZEVTMSGHDR;
     memcpy((void*)m_vtMsgBuf->m_pData,
            (void*)m_lpClientSocks[iIndex2].m_sUserName,
            REALLEN(m_lpClientSocks[iIndex2].m_sUserName)*sizeof(char));
     SendVTMessage(m_lpClientSocks[iIndex1].m_hSock, m_vtMsgBuf);
   }
 }
 return 1L;
// For passing data between two in-session clients
case VTCMD_MSGDATA:  
   if(m_lpClientSocks[iIndex1].m_iStatus != VTSOCKET_INSESSION)
   {
    return 0L;
   }
   SendVTMessage(m_lpClientSocks[iIndex1].m_hPeerSock, m_vtMsgBuf);
   return 1L;
    // Client is asking another client for a chat
case VTCMD_REQSESSION:  
    if(m_lpClientSocks[iIndex1].m_iStatus != VTSOCKET_AVAILABLE)
    {
      AfxMessageBox("Client not available!");
     return 0L;
    }
    m_lpClientSocks[iIndex1].m_iStatus = VTSOCKET_REQSESSION;
    UpdateClientList(m_lpClientSocks[iIndex1].m_sUserName,
                      VTSOCKET_REQSESSION, (char*)m_vtMsgBuf->m_pData);
    for(iIndex2 = 0; iIndex2 < m_iNextFree; iIndex2++)
    {
       iStrLen = m_vtMsgBuf->m_lLength - SIZEVTMSGHDR;  
       if(memcmp((void*)m_lpClientSocks[iIndex2].m_sUserName,  
            (void*)m_vtMsgBuf->m_pData, iStrLen) == 0)
       {
        if(m_lpClientSocks[iIndex2].m_iStatus == VTSOCKET_AVAILABLE)
         {
            break;
         }
       }
     }
     if(iIndex2 == m_iNextFree) 
     {
        AfxMessageBox("Not found in VTCMD_REQSESSION"); 
       return 0L;
  }
  m_vtMsgBuf->m_lLength = REALLEN(m_lpClientSocks[iIndex1].m_sUserName)
                                  + SIZEVTMSGHDR;
  memcpy((void*)m_vtMsgBuf->m_pData,
             (void*)m_lpClientSocks[iIndex1].m_sUserName,
             REALLEN(m_lpClientSocks[iIndex1].m_sUserName)*sizeof(char));
  SendVTMessage(m_lpClientSocks[iIndex2].m_hSock, m_vtMsgBuf);
  m_lpClientSocks[iIndex2].m_iStatus = VTSOCKET_REQSESSION;
  UpdateClientList(m_lpClientSocks[iIndex2].m_sUserName, 
             VTSOCKET_REQSESSION, m_lpClientSocks[iIndex1].m_sUserName);
  m_lpClientSocks[iIndex2].m_hPeerSock = m_lpClientSocks[iIndex1].m_hSock;
  m_lpClientSocks[iIndex1].m_hPeerSock = m_lpClientSocks[iIndex2].m_hSock;
  return 1L;
case VTCMD_SESSIONREQRESP:  
  if(m_lpClientSocks[iIndex1].m_iStatus != VTSOCKET_REQSESSION)
   {
     return 0L;
   }
  for(iIndex2 = 0; iIndex2 < m_iNextFree; iIndex2++)
  {
    if ((m_lpClientSocks[iIndex2].m_hSock == 
          m_lpClientSocks[iIndex1].m_hPeerSock) && 
          m_lpClientSocks[iIndex2].m_iStatus == VTSOCKET_REQSESSION))
    {
       break;
    }
   }
   if(iIndex2 == m_iNextFree)
   {
     return 0;
   }
   SendVTMessage(m_lpClientSocks[iIndex1].m_hPeerSock, m_vtMsgBuf);
   if(m_vtMsgBuf->m_pData[0] == 1)
   {
     m_lpClientSocks[iIndex1].m_iStatus = VTSOCKET_INSESSION;
     m_lpClientSocks[iIndex2].m_iStatus = VTSOCKET_INSESSION;
     UpdateClientList(m_lpClientSocks[iIndex1].m_sUserName, 
                  VTSOCKET_INSESSION, m_lpClientSocks[iIndex2].m_sUserName);
     UpdateClientList(m_lpClientSocks[iIndex2].m_sUserName,
                  VTSOCKET_INSESSION, m_lpClientSocks[iIndex1].m_sUserName);
     DeRegisterClient(m_lpClientSocks[iIndex1].m_sUserName);
     DeRegisterClient(m_lpClientSocks[iIndex2].m_sUserName);
   }
   else
   {
     m_lpClientSocks[iIndex1].m_iStatus = VTSOCKET_AVAILABLE;
     m_lpClientSocks[iIndex2].m_iStatus = VTSOCKET_AVAILABLE;
     UpdateClientList(m_lpClientSocks[iIndex1].m_sUserName,
                       VTSOCKET_AVAILABLE, NULL);
     UpdateClientList(m_lpClientSocks[iIndex2].m_sUserName,
                       VTSOCKET_AVAILABLE, NULL);
   }
   return 1L;
 case VTCMD_SESSIONCLOSE:  
   if (m_lpClientSocks[iIndex1].m_iStatus != VTSOCKET_INSESSION)
    {
      return 0L;
    }
    for(iIndex2 = 0; iIndex2 < m_iNextFree; iIndex2++)
    {
      if ((m_lpClientSocks[iIndex2].m_hSock == 
            m_lpClientSocks[iIndex1].m_hPeerSock) && 
           (m_lpClientSocks[iIndex2].m_iStatus == VTSOCKET_INSESSION))
      {
        break;
      }
    }
    if(iIndex2 == m_iNextFree)
    {
      return 0;
    }
    SendVTMessage(m_lpClientSocks[iIndex1].m_hPeerSock, m_vtMsgBuf);
    m_lpClientSocks[iIndex1].m_iStatus = VTSOCKET_AVAILABLE;
    m_lpClientSocks[iIndex2].m_iStatus = VTSOCKET_AVAILABLE;
    UpdateClientList(m_lpClientSocks[iIndex1].m_sUserName, 
                      VTSOCKET_AVAILABLE, NULL);
    UpdateClientList(m_lpClientSocks[iIndex2].m_sUserName, 
                      VTSOCKET_AVAILABLE, NULL);
    for(iIndex3 = 0; iIndex3 < m_iNextFree; iIndex3++)
    {
       if(m_lpClientSocks[iIndex3].m_iStatus == VTSOCKET_AVAILABLE)
       {
        if(iIndex3 != iIndex1)
        {
          m_vtMsgBuf->m_ucIdentity = VT_IDENTITY;
          m_vtMsgBuf->m_ucMsgType = VT_TEXT;
          m_vtMsgBuf->m_ucCmd = VTCMD_REGNAME;
          m_vtMsgBuf->m_lLength = 
                 REALLEN(m_lpClientSocks[iIndex1].m_sUserName) 
                 + SIZEVTMSGHDR;
          memcpy((void*)m_vtMsgBuf->m_pData, 
               (void*)m_lpClientSocks[iIndex1].m_sUserName,
               REALLEN(m_lpClientSocks[iIndex1].m_sUserName)*sizeof(char));
          SendVTMessage(m_lpClientSocks[iIndex3].m_hSock, m_vtMsgBuf);
          if (iIndex3 != iIndex2)
          {
            m_vtMsgBuf->m_lLength =
                       EALLEN(m_lpClientSocks[iIndex3].m_sUserName) 
                       + SIZEVTMSGHDR;
            memcpy((void*)m_vtMsgBuf->m_pData, 
                (void*)m_lpClientSocks[iIndex3].m_sUserName,
                REALLEN(m_lpClientSocks[iIndex3].m_sUserName)*sizeof(char));
            SendVTMessage(m_lpClientSocks[iIndex1].m_hSock, m_vtMsgBuf);
          }
        }
        if(iIndex3 != iIndex2)
         {
           m_vtMsgBuf->m_ucIdentity = VT_IDENTITY;
           m_vtMsgBuf->m_ucMsgType = VT_TEXT;
           m_vtMsgBuf->m_ucCmd = VTCMD_REGNAME;
           m_vtMsgBuf->m_lLength = 
                  EALLEN(m_lpClientSocks[iIndex2].m_sUserName) 
                  + SIZEVTMSGHDR;
           memcpy((void*)m_vtMsgBuf->m_pData, 
                (void*)m_lpClientSocks[iIndex2].m_sUserName,
                REALLEN(m_lpClientSocks[iIndex2].m_sUserName)*sizeof(char));
           SendVTMessage(m_lpClientSocks[iIndex3].m_hSock, m_vtMsgBuf);
           if(iIndex3 != iIndex1)
           {
              m_vtMsgBuf->m_lLength = 
                              EALLEN(m_lpClientSocks[iIndex3].m_sUserName) 
                             + SIZEVTMSGHDR;
              memcpy((void*)m_vtMsgBuf->m_pData, 
                (void*)m_lpClientSocks[iIndex3].m_sUserName,
                REALLEN(m_lpClientSocks[iIndex3].m_sUserName)*sizeof(char));
              SendVTMessage(m_lpClientSocks[iIndex2].m_hSock, m_vtMsgBuf);
           }
        }
     }
   }
   return 1L;
   default:
    AfxMessageBox("NOTHING"); 
  }
  return 1L;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -