📄 serverdlg.cpp
字号:
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 + -