Листинг 1 (Исходный код самого клиента) |
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <winsock.h>
#include "dstring.h"
#include "resrc1.h"
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK DialogRecv(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK DialogSend(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK MainDialog(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK DialogHistory(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
void MainDlg_OnSize(HWND hWnd, UINT state, int cx, int cy);
void HisDlg_OnSize(HWND hWnd, UINT state, int cx, int cy);
void ConnectSMTPServerSocket(void);
void TimerMessage(HWND hWnd, DWORD dwMessage);
void AddStatusIcon(HWND hWnd, DWORD dwMessage);
void CALLBACK MainTimerMessage(HWND hWnd, UINT Msg, UINT idEvent, DWORD dwTime);
BOOL CreateListenSocket(void);
BOOL CreateOutgoingSocket(void);
void HandlePopupMenu (HWND hwnd, POINT point);
int SendClientMessage(int nPort, const char *szAddr, const char *svMessage);
int SendId(int nPort, const char *szAddr, const char *svUser);
int UDP_Recv(BYTE **pInData, int *pnInDataLen);
int UDP_Send(BYTE *pData, int nDataLen, int nPort, const char *szAddr);
void UDP_Free(BYTE *pBuffer);
void DrawLBItem(LPDRAWITEMSTRUCT lpdis);
HBITMAP ShrinkBitmap ( HWND hWnd, HBITMAP hbm);
#define SMTP_PORT 25
#define SMTP_ADDR "128.1.1.1"
#define WSA_NETEVENT (WM_USER + 1)
#define WM_NOTIFYICONMSG (WM_USER + 2)
#define DIA_MESSAGE 21
#define DIA_MESSAGE_PART 22
#define DIA_USER 31
#define DIA_USERBASE 32
#define DIA_USERDENIED 33
#define DIA_USERBASE_PART 34
#define DIA_TERMINATE 41
#define DIA_MOUSE 42
#define DIA_KEYBOARD 43
#define MYLBSTYLE WS_CHILD|WS_BORDER |LBS_SORT| \
WS_VSCROLL | LBS_NOINTEGRALHEIGHT
#define CRLF "\x0d\x0a"
HINSTANCE hInst;
HWND hWndDialog;
HWND hWndMainDialog;
HWND hLboxWnd;
HWND hLBwnd;
HWND hHisEdWnd;
HWND hHisOkWnd;
HANDLE IconMail;
HBRUSH hbrushMenu;
SOCKET s;
SOCKET SendSocket;
UINT g_uState;
int iNumIcon;
BOOL m_bUserAccess; // ii?ii ee iieuciaaoae? iieuciaaouny anueie
BOOL m_bEpsent; // ionoonoaoao ee ?aeiaae
BOOL m_bMainClose; // i?eioaeoaeuii ee cae?uoi aeaaiia ieii
BOOL m_bMainState; // aeaia ee eeiiea iannaia?a?a
BOOL m_bMainVisible; // aeaeii eee iao aeaaiia ieii iannaia?a?a
BOOL m_bState; // anou eee iao i?eoaaoea niiauaiey
BOOL m_bReply; // a eaeii aeaa ioia?a?aou aeaeia i?e?ia(ioi?aaea eee i?e?i)
BOOL m_bStateReply; // ii?ii ee ?eoaou neaao?uaa niiauaiea
BOOL m_bAlarm; // ?a?ei iianiinoe
UINT m_uTimer; // oaeia? ia ieaa?uo? eeiieo
UINT m_uMainTimer; // oaeia? ia iaiiaeaiea aacu ?ca?ia a iieaeia
DString UserBase; // nienie Iieuciaaoaeae a iieaeia n Aeieoieeaie
DString MessBase; // i?eoaaoea niiauaiey n ia?aoiuie aa?anaie
DString MessHistory; // A?oea i?eoaaoeo e ioi?aaeaiiuo niiauaiee
DString AddrReplyToServer; // Aeieoiee na?aa?a
DString AddrReplyToClient; // Aeieoiee i?eoaaoaai niiauaiey io a?oaiai iieuciaaoaey
DString AddrClientToSend; // Aa?an ioi?aaeyaiiai niiauaiey
DString NameClientToSend; // Eiy iieuciaaoaey, eioi?iio ioi?aaeyaony niiauaiea
DString szUserToReply; // Eiy iieuciaaoaey, i?eneaaoaai niiauaiea
DString szBufMess; // oaeno i?eoaaoaai niiauaiey
DString AddrDiaServ; // Aeieoiee anueiaiai na?aa?a
char svUserName[256]; // Eiy iieuciaaoaey, caionoeaoaai anueo
DWORD dwBufSize=256;
char LBUserBase[256];
typedef struct {
DWORD dwFlags;
} UDPHDR;
typedef struct {
BYTE bAction;
union {
struct {
BYTE bUserNameLen; // Aeeiia eiaie iieuciaaoaey a oaea niiauaiey
DWORD dwDataLen; // ?acia? aaiiuo a oaea niiauaiey
BYTE wNumPacket; // iiia? oaeouaai iaeaoa
BYTE wNumberOfPackets; // Anaai iaeaoia aey aaiiiai niiauaiey
BYTE bFont; // O?eoo oaenoa niiauaiey
} message;
};
} DIA_HEADER;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;
WNDCLASSEX wndclass;
hInst = hInstance;
wndclass.style = 0;
wndclass.lpfnWndProc = (WNDPROC)WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInst;
wndclass.hIcon = NULL;
wndclass.hCursor = NULL;
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "WSCLAS";
if(!RegisterClassEx(&wndclass))
if(!RegisterClass((LPWNDCLASS)&wndclass.style)) return FALSE;
hWnd=CreateWindow("WSCLAS", "", 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInst, NULL);
hWndDialog=hWnd;
m_bMainState = FALSE;
m_bMainVisible = FALSE;
m_bState = FALSE;
m_bStateReply = TRUE;
m_bEpsent = FALSE;
m_bUserAccess = FALSE;
m_bAlarm = FALSE;
IconMail = LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON6),IMAGE_ICON,
20,16,LR_DEFAULTCOLOR);
hbrushMenu = CreateSolidBrush(GetSysColor(COLOR_MENU));
iNumIcon = 5;
GetUserName(svUserName,&dwBufSize);
AddrDiaServ = "128.1.1.11";
SendId(5002, AddrDiaServ.GetDString(), svUserName);
m_uMainTimer = SetTimer(hWnd, 2, 11000, TIMERPROC(MainTimerMessage));
int vk = 0x45; // eeaaeoa "A" eaoeineay
RegisterHotKey(hWnd,1000+(MOD_ALT*0x100)+vk,MOD_ALT,vk); // ?aaeno?e?oai ALT-E eae ai?y?o? eeaaeoo
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DeleteObject(hbrushMenu);
UnregisterHotKey(hWnd,1000+(MOD_ALT*0x100)+vk);
return msg.wParam;
}
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
LPCTSTR pszIDMess;
POINT pt;
switch(msg) {
case WSA_NETEVENT:
WndProc_OnWSANetEvent(hWnd, msg, wParam, lParam);
break;
case WM_TIMER:
if(m_bEpsent == FALSE) {
g_uState = !g_uState;
TimerMessage(hWnd, NIM_MODIFY);
}
break;
case WM_HOTKEY:
if(m_bUserAccess == TRUE) {
if(m_bEpsent == FALSE&&m_bMainState==TRUE) {
m_bEpsent=TRUE;
m_bMainState=FALSE;
TimerMessage(hWnd, NIM_DELETE);
} else {
m_bEpsent = FALSE;
if(m_bMainState==FALSE&&m_bMainClose==FALSE&&m_bEpsent==FALSE) {
m_bMainState = TRUE;
AddStatusIcon(hWnd, NIM_ADD);
}
}
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_EXIT_DIASOFT:
m_bMainClose = TRUE; // aeaaiue aeaeia cae?uo i?eioaeoaeuii
m_bMainState = FALSE; // aeaaiay eeiiea ia aeaia
m_bMainVisible = FALSE; // aeaaiue aeaeia ia aeaai
m_bAlarm = FALSE;
KillTimer(hWnd, m_uTimer);
TimerMessage(hWnd, NIM_DELETE); // oae?aai aeaaio? eeiieo
EndDialog(hWndMainDialog, 0); // oae?aai aeaaiue aeaeia
szBufMess = "";
break;
case ID_OPEN_DIASOFT:
if(m_bMainVisible==FALSE) {
m_bMainClose=FALSE;
m_bMainState=TRUE;
m_bMainVisible=TRUE;
pszIDMess = MAKEINTRESOURCE(IDD_MAINDIALOG);
DialogBoxParam(hInst, pszIDMess, hWnd, DLGPROC(MainDialog), 0);
}
break;
case ID_CHEIF_DIASOFT:
m_bEpsent=TRUE;
m_bMainState=FALSE;
m_bAlarm=TRUE;
iNumIcon=8;
TimerMessage(hWnd, NIM_DELETE);
break;
case ID_NODIST_DIASOFT:
m_bAlarm=FALSE;
break;
case ID_ABSENT_DIASOFT:
m_bEpsent=TRUE;
m_bMainState=FALSE;
m_bAlarm=FALSE;
iNumIcon=7;
TimerMessage(hWnd, NIM_DELETE);
break;
case ID_NORMAL_DIASOFT:
m_bAlarm=FALSE;
iNumIcon=5;
AddStatusIcon(hWnd, NIM_MODIFY);
break;
}
break;
case WM_NOTIFYICONMSG:
switch(lParam) {
case WM_LBUTTONDBLCLK:
if(m_bMainState==FALSE&&m_bState==TRUE&&m_bStateReply==TRUE) {
TimerMessage(hWnd, NIM_DELETE);
pszIDMess = MAKEINTRESOURCE(IDD_INCOMMESSAGE);
DialogBoxParam(hInst, pszIDMess, hWnd, DLGPROC(DialogRecv), 0);
if(MessBase.GetDString()=="") m_bState = FALSE;
}
else if(m_bMainState==TRUE&&m_bState==TRUE&&m_bStateReply==TRUE) {
AddStatusIcon(hWnd, NIM_MODIFY);
pszIDMess = MAKEINTRESOURCE(IDD_INCOMMESSAGE);
DialogBoxParam(hInst, pszIDMess, hWnd, DLGPROC(DialogRecv), 0);
}
else if(m_bState==FALSE&&m_bMainVisible==FALSE) {
pszIDMess = MAKEINTRESOURCE(IDD_MAINDIALOG);
DialogBoxParam(hInst, pszIDMess, hWnd, DLGPROC(MainDialog), 0);
}
break;
case WM_RBUTTONDOWN:
GetCursorPos(&pt);
HandlePopupMenu (hWnd, pt);
break;
default:
break;
}
break;
HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}
BOOL CALLBACK DialogRecv(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
DString NameRecv, IpRecv, MessRecv, Temp, TempMessHis, TitleSend;
int ndx1, ndx2;
switch(msg) {
case WM_INITDIALOG:
m_bReply = FALSE;
m_bStateReply = FALSE;
if((ndx1 = MessBase.Find(",:2"))!=-1) {
NameRecv = "Niiauaiea io \"";
Temp = MessBase.Mid(2);
Temp = Temp.Left(ndx1-2);
NameRecv += Temp;
NameRecv += "\"";
MessBase = MessBase.Mid(2);
NameClientToSend = Temp;
}
SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM) NameRecv.GetDString());
if((ndx1 = MessBase.Find(",:3"))!=-1) {
MessRecv = MessBase.Mid(ndx1+3);
if((ndx2 = MessRecv.Find("_:"))!=-1) MessRecv = MessRecv.Left(ndx2);
}
SendMessage(GetDlgItem(hDlg, IDC_EDIT_MSG), WM_SETTEXT, 0, (LPARAM)MessRecv.GetDString());
SendMessage(GetDlgItem(hDlg, IDC_BUTTON_REPLY), WM_SETFOCUS, 0, 0);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON_OK), FALSE);
if(MessBase.Find("_:")==-1) {
m_bState = FALSE;
KillTimer(hWndDialog, m_uTimer);
}
return(TRUE);
break;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDC_BUTTON_OK:
if(m_bReply == TRUE) {
DString SendBuf;
char SendBuf1[256];
if((ndx1 = MessBase.Find(",:2"))!=-1) {
IpRecv = MessBase.Mid(ndx1+3);
if((ndx2 = IpRecv.Find(",:3"))!=-1) IpRecv = IpRecv.Left(ndx2);
}
if((ndx1 = MessBase.Find("_:"))!=-1) {
MessBase = MessBase.Mid(ndx1);
m_bState = TRUE;
}
else {
MessBase = "";
m_bState = FALSE;
}
m_bStateReply = TRUE;
SendBuf = svUserName;
TempMessHis = "_:";
TempMessHis += svUserName;
TempMessHis += ",:2";
TempMessHis += NameClientToSend;
TempMessHis += ",:3";
GetDlgItemText(hDlg, IDC_EDIT_MSG, SendBuf1, sizeof(SendBuf1));
SendBuf += SendBuf1;
TempMessHis += SendBuf1;
TempMessHis += MessHistory;
MessHistory = TempMessHis;
SendClientMessage(5001, IpRecv.GetDString(), SendBuf.GetDString());
}
EndDialog(hDlg, 0);
m_bReply = FALSE;
break;
case IDC_BUTTON_REPLY:
m_bReply = TRUE;
TitleSend = "Niiauaiea aey \"";
TitleSend += NameClientToSend;
TitleSend += "\"";
SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)TitleSend.GetDString());
SendMessage(GetDlgItem(hDlg, IDC_BUTTON_OK), WM_SETTEXT, 0, (LPARAM) "Ioi?aaeou");
SendMessage(GetDlgItem(hDlg, IDC_BUTTON_REPLY), WM_KILLFOCUS, 0, 0);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_MSG), EM_SETREADONLY, FALSE, 0);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_MSG), WM_SETTEXT, 0, (LPARAM) "");
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON_REPLY), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON_OK), TRUE);
break;
case IDC_BUTTON_CANCEL:
if((ndx1 = MessBase.Find("_:"))!=-1) {
MessBase = MessBase.Mid(ndx1);
m_bState = TRUE;
}
else {
MessBase = "";
m_bState = FALSE;
}
m_bStateReply = TRUE;
EndDialog(hDlg, 0);
break;
case IDC_BUTTON_HISTORY:
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HISTORY), hWndDialog, DLGPROC(DialogHistory), 0);
break;
default:
break;
}
break;
case WM_KILLFOCUS:
SendMessage(GetDlgItem(hDlg, IDC_EDIT_MSG), WM_SETFOCUS, 0, 0);
break;
case WM_CLOSE:
if((ndx1 = MessBase.Find("_:"))!=-1) {
MessBase = MessBase.Mid(ndx1);
m_bState = TRUE;
}
else {
MessBase = "";
m_bState = FALSE;
}
m_bStateReply = TRUE;
EndDialog(hDlg, 0);
break;
}
return(FALSE);
}
BOOL CALLBACK DialogSend(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
char SendBuf1[256];
DString SendBuf, TempMessHis, TitleSend;
switch(msg) {
case WM_INITDIALOG:
m_bReply = TRUE;
TitleSend = "Niiauaiea aey \"";
TitleSend += NameClientToSend;
TitleSend += "\"";
SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)TitleSend.GetDString());
SendMessage(GetDlgItem(hDlg, IDC_BUTTON_OK), WM_SETTEXT, 0, (LPARAM) "Ioi?aaeou");
SendMessage(GetDlgItem(hDlg, IDC_BUTTON_REPLY), WM_KILLFOCUS, 0, 0);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_MSG), EM_SETREADONLY, FALSE, 0);
SendMessage(GetDlgItem(hDlg, IDC_EDIT_MSG), WM_SETTEXT, 0, (LPARAM) "");
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON_REPLY), FALSE);
return(TRUE);
break;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDC_BUTTON_OK:
m_bStateReply = TRUE;
SendBuf = svUserName;
TempMessHis = "_:";
TempMessHis += svUserName;
TempMessHis += ",:2";
TempMessHis += NameClientToSend;
TempMessHis += ",:3";
GetDlgItemText(hDlg, IDC_EDIT_MSG, SendBuf1, sizeof(SendBuf1));
SendBuf += SendBuf1;
TempMessHis += SendBuf1;
TempMessHis += MessHistory;
MessHistory = TempMessHis;
SendClientMessage(5001, AddrClientToSend.GetDString(), SendBuf.GetDString());
EndDialog(hDlg, 0);
m_bReply = FALSE;
break;
case IDC_BUTTON_CANCEL:
m_bStateReply = TRUE;
EndDialog(hDlg, 0);
break;
case IDC_BUTTON_HISTORY:
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HISTORY), hWndDialog, DLGPROC(DialogHistory), 0);
break;
}
break;
case WM_CLOSE:
m_bStateReply = TRUE;
EndDialog(hDlg, 0);
break;
default:
break;
}
return(FALSE);
}
BOOL CALLBACK MainDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
DString TempUserBase1, TempUserBase2, TempUser;
LPTSTR psz;
int ndx1, ndx2, cx, i;
RECT rc;
TempUserBase1 = UserBase;
switch(msg) {
case WM_INITDIALOG:
hWndMainDialog = hDlg;
hLboxWnd = GetDlgItem(hDlg,IDC_LIST1);
cx = GetSystemMetrics(SM_CXSCREEN);
cx = cx - 125;
MoveWindow( hDlg, cx, 4, 115, 230, TRUE);
GetClientRect(hDlg, &rc);
MoveWindow(GetDlgItem(hDlg,IDC_MAIN_BUTTON),1,rc.bottom-22,30,22,TRUE);
i = 0;
cx = 0;
memset(LBUserBase,'\0',256);
do {
if((ndx1 = TempUserBase1.Find("_:"))!=-1) {
TempUserBase1 = TempUserBase1.Mid(ndx1+2);
ndx2 = TempUserBase1.Find(",:3");
TempUser = TempUserBase1.Left(ndx2);
if(i==0) strcpy(LBUserBase+1, TempUser.GetDString());
else strcat(LBUserBase+cx+1, TempUser.GetDString());
SendMessage(hLboxWnd,LB_ADDSTRING,0,(LPARAM)(LPCSTR)LBUserBase+cx+1);
cx = cx+1+strlen(TempUser.GetDString());
i++;
TempUserBase1 = TempUserBase1.Mid(ndx2+3);
}
} while(ndx1!=-1);
m_bMainVisible = TRUE;
return(TRUE);
break;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDC_LIST1:
if(HIWORD(wParam)==LBN_DBLCLK&&m_bStateReply==TRUE) {
psz = (LPTSTR)SendMessage(GetDlgItem(hDlg,IDC_LIST1), LB_GETITEMDATA, SendMessage(GetDlgItem(hDlg,IDC_LIST1), LB_GETCURSEL,0,0), (LPARAM)0);
NameClientToSend = psz;
if((ndx1 = TempUserBase1.Find(NameClientToSend.GetDString()))!=-1) {
TempUserBase2 = TempUserBase1.Mid(ndx1);
if((ndx2 = TempUserBase2.Find(",:3"))!=-1) {
TempUserBase1 = TempUserBase2.Mid(ndx2+3);
if((ndx1 = TempUserBase1.Find("_:"))!=-1) AddrClientToSend = TempUserBase1.Left(ndx1);
else AddrClientToSend = TempUserBase1;
}
}
m_bStateReply = FALSE;
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_INCOMMESSAGE), hWndDialog, DLGPROC(DialogSend), 0);
}
}
break;
case WM_PAINT:
i = SendMessage(hLboxWnd, LB_GETCOUNT, 0, 0);
if(i==0) {
GetClientRect(hLboxWnd, &rc);
FillRect(GetDC(hLboxWnd), &rc, hbrushMenu);
}
break;
case WM_DRAWITEM:
GetClientRect(hLboxWnd, &rc);
((LPDRAWITEMSTRUCT)lParam)->rcItem.right = rc.right;
DrawLBItem((LPDRAWITEMSTRUCT)lParam);
i = SendMessage(hLboxWnd, LB_GETCOUNT, 0, 0);
i = i * 16;
GetClientRect(hLboxWnd, &rc);
if(rc.top<i) {
rc.top="rc.top" + i;
FillRect(GetDC(hLboxWnd), &rc, hbrushMenu);
}
return(DefWindowProc(hDlg, msg, wParam, lParam));
break;
HANDLE_MSG(hDlg, WM_SIZE, MainDlg_OnSize);
case WM_CLOSE:
m_bMainClose="TRUE;"
m_bMainState="FALSE;"
m_bMainVisible="FALSE;"
if(m_bState="=" FALSE) TimerMessage(hWndDialog, NIM_DELETE);
EndDialog(hDlg, 0);
break;
} return(FALSE);
}
BOOL CALLBACK DialogHistory(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DString TempHis1, TempHis2, TempHis3, TempMainHis; int ndx1,ndx2; RECT rc; switch(msg) { case WM_INITDIALOG: hHisEdWnd="GetDlgItem(hDlg,IDC_HISTORY_EDIT);" hHisOkWnd="GetDlgItem(hDlg,IDC_HISTORY_OK);" GetClientRect(hDlg, &rc); MoveWindow(hHisEdWnd,5,5,rc.right-10,rc.bottom-32,TRUE); MoveWindow(hHisOkWnd,rc.right/2-30,rc.bottom-23,60,20,TRUE); TempHis1="svUserName;" TempHis1 +=",:2" ; TempHis1 +="NameClientToSend;" TempHis2="NameClientToSend;" TempHis2 +=",:2" ; TempHis2 +="svUserName;" TempMainHis="MessHistory;" do { ndx1="TempMainHis.Find(TempHis1.GetDString());" ndx2="TempMainHis.Find(TempHis2.GetDString());" if(ndx1!="-1&&ndx2!=-1)" { if(ndx1 0) {
closesocket(s);
return FALSE;
}
return TRUE;
}
BOOL CreateListenSocket(void)
{
struct sockaddr_in srv_address;
int namelen;
int nPort;
nPort=atoi("5001");
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s != INVALID_SOCKET) {
memset(&srv_address,0,sizeof(SOCKADDR_IN));
srv_address.sin_addr.S_un.S_addr=INADDR_ANY;
srv_address.sin_family = AF_INET;
srv_address.sin_port = htons((WORD)nPort);
}
if(bind(s, (SOCKADDR *) &srv_address, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
closesocket(s);
return FALSE;
} else {
namelen=sizeof(SOCKADDR_IN);
getsockname(s,(SOCKADDR *)&srv_address,&namelen);
return TRUE;
}
}
BOOL CreateOutgoingSocket(void)
{
struct sockaddr_in srv_address;
int namelen;
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(SendSocket != INVALID_SOCKET) {
memset(&srv_address,0,sizeof(SOCKADDR_IN));
srv_address.sin_addr.S_un.S_addr=INADDR_ANY;
srv_address.sin_family = AF_INET;
srv_address.sin_port = 0;
}
if(bind(SendSocket, (SOCKADDR *) &srv_address, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
closesocket(s);
return FALSE;
} else {
namelen=sizeof(SOCKADDR_IN);
getsockname(s,(SOCKADDR *)&srv_address,&namelen);
return TRUE;
}
}
void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
DIA_HEADER *pHeader;
DString RecBuf, TempMessHis;
int nRet,nSize;
if(WSAGETSELECTEVENT(lParam) == FD_READ) {
if((nRet=UDP_Recv((BYTE **)&pHeader,&nSize))>0) {
if(nSize<sizeof(DIA_HEADER)) { UDP_Free((BYTE*)pHeader); return; } if(pHeader->bAction==DIA_USERBASE) {
BYTE *pData=(BYTE *)malloc(pHeader->message.dwDataLen);
if(pData==NULL) {
UDP_Free((BYTE*)pHeader);
return;
}
memcpy(pData,(BYTE *)pHeader+sizeof(DIA_HEADER),nSize);
UserBase = (LPCSTR)pData;
m_bUserAccess = TRUE;
if(m_bMainState==FALSE&&m_bMainClose==FALSE&&m_bEpsent==FALSE) {
m_bMainState = TRUE;
AddStatusIcon(hWnd, NIM_ADD);
}
free(pData);
}
if(pHeader->bAction==DIA_USERDENIED) {
BYTE *pData=(BYTE *)malloc(pHeader->message.dwDataLen);
if(pData==NULL) {
UDP_Free((BYTE*)pHeader);
return;
}
memcpy(pData,(BYTE *)pHeader+sizeof(DIA_HEADER),nSize);
UserBase = (LPCSTR)pData;
m_bUserAccess = FALSE;
if(m_bMainState==TRUE) {
TimerMessage(hWnd, NIM_DELETE);
m_bMainState = FALSE;
}
free(pData);
}
if(pHeader->bAction==DIA_MESSAGE_PART) {
m_bState = TRUE;
AddrReplyToClient = AddrReplyToServer;
BYTE *pData=(BYTE *)malloc(pHeader->message.dwDataLen);
if(pData==NULL) {
UDP_Free((BYTE*)pHeader);
return;
}
memcpy(pData,(BYTE *)pHeader+sizeof(DIA_HEADER),nSize);
szBufMess = (LPCSTR)pData;
MessageBox(NULL, "I?eoea ?anou aeeiiiai iaeaoa !!!", "Error", MB_OK|MB_SETFOREGROUND);
free(pData);
}
if(pHeader->bAction==DIA_MESSAGE) {
m_bState = TRUE;
AddrReplyToClient = AddrReplyToServer;
BYTE *pData=(BYTE *)malloc(pHeader->message.dwDataLen);
if(pData==NULL) {
UDP_Free((BYTE*)pHeader);
return;
}
memcpy(pData,(BYTE *)pHeader+sizeof(DIA_HEADER),nSize);
szBufMess = (LPCSTR)pData;
MessBase += "_:";
MessBase += szBufMess.Left(pHeader->message.bUserNameLen);
MessBase += ",:2";
MessBase += AddrReplyToClient;
MessBase += ",:3";
MessBase += szBufMess.Mid(pHeader->message.bUserNameLen);
TempMessHis = "_:";
TempMessHis += szBufMess.Left(pHeader->message.bUserNameLen);
TempMessHis += ",:2";
TempMessHis += svUserName;
TempMessHis += ",:3";
TempMessHis += szBufMess.Mid(pHeader->message.bUserNameLen);
TempMessHis += MessHistory;
MessHistory = TempMessHis;
if(m_bMainState==FALSE&&m_bEpsent==FALSE) TimerMessage(hWnd, NIM_ADD);
m_uTimer = SetTimer(hWnd, 1, 500, NULL);
free(pData);
if(m_bAlarm==TRUE) {
DString SendAlarm;
SendAlarm = svUserName;
SendAlarm += "Aeaa-oi iaaeecinoe oiaeo ia?aeunoai, iioe?ay iioiua ?o?ee....";
SendClientMessage(5001, AddrReplyToClient.GetDString(), SendAlarm.GetDString());
}
}
UDP_Free((BYTE *)pHeader);
}
}
}
void ConnectSMTPServerSocket(void)
{
SOCKET nSMTPServerSocket;
struct sockaddr_in smtp_address;
int nConnect;
int iLength;
int iMsg = 0;
int iEnd = 0;
BYTE sBuf[4096];
char *MailMessage[] =
{
"HELO axel.ru\r\n",
"MAIL FROM:<", "RCPT TO:<Vasia@Pupkin.ru>\r\n",
"DATA\r\n",
"",
"QUIT\r\n",
NULL
};
lstrcat(MailMessage[1], svUserName);
lstrcat(MailMessage[1], "@axel.ru>\r\n");
MailMessage[4] = svUserName;
lstrcat(MailMessage[4]," is enter to Domain\r\n\r\n.\r\n");
nSMTPServerSocket = socket(PF_INET, SOCK_STREAM, 0);
if(nSMTPServerSocket != INVALID_SOCKET) {
smtp_address.sin_family = AF_INET;
smtp_address.sin_addr.s_addr = inet_addr(SMTP_ADDR);
smtp_address.sin_port = htons(SMTP_PORT);
nConnect = connect(nSMTPServerSocket, (PSOCKADDR)&smtp_address, sizeof(smtp_address));
if(nConnect) {
}
else {
do {
iLength = recv(nSMTPServerSocket, (LPSTR)sBuf+iEnd, sizeof(sBuf)-iEnd, 0);
iEnd += iLength;
sBuf[iEnd] = '\0';
send(nSMTPServerSocket, (LPSTR)MailMessage[iMsg], strlen(MailMessage[iMsg]), 0);
iMsg++;
} while(MailMessage[iMsg]);
}
closesocket(nSMTPServerSocket);
}
}
void TimerMessage(HWND hWnd, DWORD dwMessage)
{
HICON hStatusIcon;
LPCSTR pszIDStatusIcon;
NOTIFYICONDATA tnd;
pszIDStatusIcon = MAKEINTRESOURCE(g_uState?IDI_ICON3:IDI_ICON4);
hStatusIcon = LoadIcon( hInst,pszIDStatusIcon );
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = hWnd;
tnd.uID = 1;
tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage = WM_NOTIFYICONMSG;
tnd.hIcon = hStatusIcon;
lstrcpyn(tnd.szTip, "Aai niiauaiea", sizeof(tnd.szTip));
Shell_NotifyIcon( dwMessage, &tnd );
}
void AddStatusIcon(HWND hWnd, DWORD dwMessage)
{
HICON hStatusIcon; // Iniiaiay eeiiea a noaoona
LPCSTR pszIDStatusIcon; // Oeacaoaeu ia aeaaio? eeiieo a noaoona
NOTIFYICONDATA tnd;
switch(iNumIcon) {
case 5:
pszIDStatusIcon = MAKEINTRESOURCE(IDI_ICON5);
break;
case 7:
pszIDStatusIcon = MAKEINTRESOURCE(IDI_ICON7);
break;
case 8:
pszIDStatusIcon = MAKEINTRESOURCE(IDI_ICON8);
break;
}
hStatusIcon = LoadIcon( hInst,pszIDStatusIcon );
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = hWnd;
tnd.uID = 1;
tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage = WM_NOTIFYICONMSG;
tnd.hIcon = hStatusIcon;
lstrcpyn(tnd.szTip, "Anuea :)", sizeof(tnd.szTip));
Shell_NotifyIcon( dwMessage, &tnd );
}
void HandlePopupMenu (HWND hWnd, POINT point)
{
HMENU hMenu;
HMENU hMenuTrackPopup;
HBITMAP hbmMenuNormal;
LPCSTR pszIDMenu;
pszIDMenu = MAKEINTRESOURCE(IDM_POPUPMENU1);
hMenu = LoadMenu (hInst, pszIDMenu);
if (!hMenu) return;
hMenuTrackPopup = GetSubMenu (hMenu, 0);
hbmMenuNormal = ShrinkBitmap (hWnd, LoadBitmap (hInst, MAKEINTRESOURCE(IDB_BITMAP2)));
SetMenuItemBitmaps (hMenuTrackPopup, 5, MF_BYPOSITION, hbmMenuNormal, hbmMenuNormal);
TrackPopupMenu (hMenuTrackPopup, 0, point.x, point.y, 0, hWnd, NULL);
DestroyMenu (hMenu);
}
int SendClientMessage(int nPort, const char *szAddr, const char *svMessage)
{
int nMessLen, nDataLen, nRet, it;
nMessLen=lstrlen(svMessage)+1;
nDataLen=sizeof(DIA_HEADER)+nMessLen;
DIA_HEADER *phh=(DIA_HEADER *)malloc(nDataLen);
phh->message.bUserNameLen=lstrlen(svUserName);
phh->message.dwDataLen=nMessLen;
// lstrcpy((LPTSTR)(phh+1),svMessage);
if(lstrlen(svMessage)+1<240) { phh->bAction=DIA_MESSAGE;
lstrcpy((LPTSTR)(phh+1),svMessage);
nRet=UDP_Send((BYTE *)phh,nDataLen, nPort, szAddr);
} else {
it = nMessLen/240;
phh->message.wNumberOfPackets = it+1;
phh->bAction=DIA_MESSAGE_PART;
for(int i=0;i<=it;i++) { phh->message.wNumPacket = i+1;
if(it+1!=i+1) memcpy((LPTSTR)(phh+1),svMessage+i*240,240);
else memcpy((LPTSTR)(phh+1),svMessage+i*240,100);
nRet=UDP_Send((BYTE *)phh,sizeof(DIA_HEADER)+240, nPort, szAddr);
Sleep(50);
}
}
free(phh);
return nRet;
}
int SendId(int nPort, const char *szAddr, const char *svMessage)
{
int nDataLen=sizeof(DIA_HEADER)+lstrlen(svMessage)+1;
DIA_HEADER *phh=(DIA_HEADER *)malloc(nDataLen);
phh->bAction=DIA_USER;
phh->message.dwDataLen=lstrlen(svMessage)+1;
lstrcpy((LPTSTR)(phh+1),svMessage);
int nRet=UDP_Send((BYTE *)phh,nDataLen, nPort, szAddr);
free(phh);
return nRet;
}
int UDP_Recv(BYTE **pInData, int *pnInDataLen)
{
DWORD len;
ioctlsocket(s,FIONREAD,&len);
if(len>=sizeof(UDPHDR)) {
BYTE *buf=(BYTE *)malloc(len);
if(buf==NULL) {
*pInData=NULL;
*pnInDataLen=0;
return -1;
}
SOCKADDR_IN s_from;
LPSTR lpAddr;
int fromlen=sizeof(SOCKADDR_IN);
DWORD lenret;
lenret=recvfrom(s,(char *)buf,len,MSG_PEEK,(struct sockaddr *)&s_from,&fromlen);
if(lenret<len) { free(buf); *pInData="NULL;" *pnInDataLen="0;" return 1; } fromlen="sizeof(SOCKADDR_IN);" lenret="recvfrom(s,(char" *)buf,len,0,(struct sockaddr *)&s_from,&fromlen); if(lenretdwFlags=0;
memcpy(buf+sizeof(UDPHDR),pData,nDataLen);
struct sockaddr_in s_address;
if(SendSocket != INVALID_SOCKET) {
memset(&s_address,0,sizeof(SOCKADDR_IN));
s_address.sin_family = AF_INET;
s_address.sin_addr.s_addr = inet_addr(szAddr);
s_address.sin_port = htons((WORD)nPort);
}
int lenret;
lenret=sendto(SendSocket,(char *)buf,nDataLen+sizeof(UDPHDR),0,(SOCKADDR *)&(s_address),sizeof(SOCKADDR_IN));
free(buf);
if(lenret==SOCKET_ERROR) return -1;
if(lenret<nDataLen) return 0; return 1; } void UDP_Free(BYTE *pBuffer) { if(pBuffer="=NULL)" return; free(pBuffer-sizeof(UDPHDR)); } void CALLBACK MainTimerMessage(HWND hWnd, UINT Msg, UINT idEvent, DWORD dwTime) { char szOnlineMess[256]; strcpy(szOnlineMess, svUserName); SendId(5002, AddrDiaServ.GetDString(), szOnlineMess); } void MainDlg_OnSize(HWND hDlg, UINT state, int cx, int cy) { if(state="=SIZE_MINIMIZED)" { m_bMainVisible="FALSE;" EndDialog(hDlg, 0); } else { MoveWindow(hLboxWnd,0,0,cx,cy-25,TRUE); MoveWindow(GetDlgItem(hDlg,IDC_MAIN_BUTTON),1,cy-22,30,22,TRUE); } } void HisDlg_OnSize(HWND hDlg, UINT state, int cx, int cy) { if(state!="SIZE_MINIMIZED)" { MoveWindow(hHisEdWnd,5,5,cx-10,cy-32,TRUE); MoveWindow(hHisOkWnd,cx/2-30,cy-23,60,20,TRUE); } } void DrawLBItem(LPDRAWITEMSTRUCT lpdis) { RECT rc; LPCSTR psz; if (!lpdis->itemData) return;
if ((lpdis->itemAction & ODA_DRAWENTIRE) || ((lpdis->itemAction & ODA_SELECT) && (lpdis->itemState & ODS_SELECTED))) {
rc = lpdis->rcItem;
if (lpdis->CtlType != ODT_BUTTON) {
FillRect(lpdis->hDC, &lpdis->rcItem, hbrushMenu);
}
SetBkColor(lpdis->hDC, GetSysColor(COLOR_MENU));
SetTextColor(lpdis->hDC, 0x00ff0000);
psz = (LPCSTR)(UINT)lpdis->itemData;
DrawIconEx(lpdis->hDC,rc.left,rc.top,IconMail,20,16,NULL,NULL,DI_NORMAL);
rc.left = rc.left + 20;
DrawText(lpdis->hDC,psz,-1,&rc,DT_LEFT);
if (lpdis->itemState & ODS_SELECTED) InvertRect(lpdis->hDC, &lpdis->rcItem);
if (lpdis->itemState & ODS_FOCUS) DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
}
else if (lpdis->itemAction & ODA_SELECT) {
InvertRect(lpdis->hDC, &lpdis->rcItem);
}
else if (lpdis->itemAction & ODA_FOCUS) {
DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
}
}
HBITMAP ShrinkBitmap ( HWND hwnd, HBITMAP hbm)
{
HDC hdc;
HDC hmemorydcNew;
HDC hmemorydcOld;
LONG checkMarkSize;
HBITMAP hCheckBitmap;
HBITMAP hOldBitmapSave;
HBITMAP hNewBitmapSave;
hdc = GetDC(hwnd);
hmemorydcNew = CreateCompatibleDC(hdc);
hmemorydcOld = CreateCompatibleDC(hdc);
checkMarkSize = GetMenuCheckMarkDimensions();
hCheckBitmap = CreateCompatibleBitmap(hdc, LOWORD (checkMarkSize), HIWORD (checkMarkSize));
hOldBitmapSave = SelectObject(hmemorydcNew, hCheckBitmap);
hNewBitmapSave = SelectObject(hmemorydcOld, hbm);
StretchBlt(hmemorydcNew, 0, 0, LOWORD(checkMarkSize), HIWORD(checkMarkSize),
hmemorydcOld, 0, 0, 32, 32, SRCCOPY);
SelectObject(hmemorydcNew, hOldBitmapSave);
SelectObject(hmemorydcOld, hNewBitmapSave);
DeleteDC(hmemorydcNew);
DeleteDC(hmemorydcOld);
ReleaseDC(hwnd, hdc);
return hCheckBitmap;
}
Листинг 2 (Исходник класса, для работы со
строками, наподобии CString в MFC) |
#include "dstring.h"
static int rgInitData[] = { -1, 0, 0, 0 };
static D_DATADEF DStringData* dDataNil = (DStringData*)&rgInitData;
static LPCSTR dPchNil = (LPCSTR)(((BYTE*)&rgInitData)+sizeof(DStringData));
const DString& DAPI DGetEmptyString()
{ return *(DString*)&dPchNil; }
DString::DString()
{
Init();
}
DString::DString(const DString& stringSrc)
{
if (stringSrc.GetData()->nRefs >= 0) {
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
else {
Init();
*this = stringSrc.m_pchData;
}
}
DString::~DString()
{
if (GetData() != dDataNil) {
if (InterlockedDecrement(&GetData()->nRefs) <= 0) delete[] (BYTE*)GetData(); } } void DString::AllocCopy(DString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const { int nNewLen="nCopyLen" + nExtraLen; if (nNewLen="=" 0) dest.Init(); else { dest.AllocBuffer(nNewLen); memcpy(dest.m_pchData, m_pchData+nCopyIndex, nCopyLen*sizeof(CHAR)); } } void DString::AssignCopy(int nSrcLen, LPCSTR lpszSrcData) { AllocBeforeWrite(nSrcLen); memcpy(m_pchData, lpszSrcData, nSrcLen*sizeof(CHAR)); GetData()->nDataLength = nSrcLen;
m_pchData[nSrcLen] = '\0';
}
void DString::AllocBeforeWrite(int nLen)
{
if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength) {
Release();
AllocBuffer(nLen);
}
}
DString::DString(LPCSTR lpsz)
{
Init();
int nSrcLen = lpsz != NULL ? strlen(lpsz) : 0;
if (nSrcLen != 0) {
AllocBuffer(nSrcLen);
memcpy(m_pchData, lpsz, nSrcLen+1);
ReleaseBuffer();
}
}
char * DString::GetDString()
{ return (char *)m_pchData; }
inline int DString::Compare(LPCSTR lpsz) const
{ return strcmp(m_pchData, lpsz); }
inline DStringData* DString::GetData() const
{ return ((DStringData*)m_pchData)-1; }
inline void DString::Init()
{ m_pchData = dEmptyString.m_pchData; }
inline int DString::SafeStrlen(LPCSTR lpsz)
{ return (lpsz == NULL) ? 0 : strlen(lpsz); }
const DString& DString::operator+=(const DString& string)
{
ConcatInPlace(string.GetData()->nDataLength, string.m_pchData);
return *this;
}
const DString& DString::operator+=(CHAR ch)
{
ConcatInPlace(1, &ch);
return *this;
}
const DString& DString::operator+=(LPCSTR lpsz)
{
ConcatInPlace(SafeStrlen(lpsz), lpsz);
return *this;
}
const DString& DString::operator=(const DString& stringSrc)
{
if (m_pchData != stringSrc.m_pchData) {
if ((GetData()->nRefs <0 && GetData() !="dDataNil)" || stringSrc.GetData()->nRefs <0) { AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
}
else {
Release();
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
}
return *this;
}
const DString& DString::operator=(LPCSTR lpsz)
{
AssignCopy(SafeStrlen(lpsz), lpsz);
return *this;
}
void DString::AllocBuffer(int nLen)
{
if (nLen <0) MessageBox(NULL, "Aeeiia DString ia ii?ao auou io?eoaoaeuiie !!!", "Error", MB_OK|MB_SETFOREGROUND); if (nLen="=" 0) Init(); else { DStringData* pData="(DStringData*)new" BYTE[sizeof(DStringData) + (nLen+1)*sizeof(CHAR)]; pData->nRefs = 1;
pData->data()[nLen] = '\0';
pData->nDataLength = nLen;
pData->nAllocLength = nLen;
m_pchData = pData->data();
}
}
void DString::ReleaseBuffer(int nNewLength)
{
if (nNewLength == -1) nNewLength = strlen(m_pchData);
GetData()->nDataLength = nNewLength;
m_pchData[nNewLength] = '\0';
}
void DString::Release(DStringData* pData)
{
if (pData != dDataNil) {
if (InterlockedDecrement(&pData->nRefs) <= 0) delete[] (BYTE*)pData; } } void DString::Release() { if (GetData() !="dDataNil)" { if (InterlockedDecrement(&GetData()->nRefs) <= 0) delete[] (BYTE*)GetData(); Init(); } } void DString::ConcatCopy(int nSrc1Len, LPCSTR lpszSrc1Data, int nSrc2Len, LPCSTR lpszSrc2Data) { int nNewLen="nSrc1Len" + nSrc2Len; if (nNewLen !="0)" { AllocBuffer(nNewLen); memcpy(m_pchData, lpszSrc1Data, nSrc1Len*sizeof(CHAR)); memcpy(m_pchData+nSrc1Len, lpszSrc2Data, nSrc2Len*sizeof(CHAR)); } } void DString::ConcatInPlace(int nSrcLen, LPCSTR lpszSrcData) { if (nSrcLen="=" 0) return; if (GetData()->nRefs > 1 || GetData()->nDataLength + nSrcLen > GetData()->nAllocLength) {
DStringData* pOldData = GetData();
ConcatCopy(GetData()->nDataLength, m_pchData, nSrcLen, lpszSrcData);
DString::Release(pOldData);
}
else {
memcpy(m_pchData+GetData()->nDataLength, lpszSrcData, nSrcLen*sizeof(CHAR));
GetData()->nDataLength += nSrcLen;
m_pchData[GetData()->nDataLength] = '\0';
}
}
int DString::Find(CHAR ch) const
{
LPSTR lpsz = strchr(m_pchData, (CHAR)ch);
return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);
}
int DString::ReverseFind(CHAR ch) const
{
LPSTR lpsz = strrchr(m_pchData, (CHAR)ch);
return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);
}
int DString::Find(LPCSTR lpszSub) const
{
LPSTR lpsz = strstr(m_pchData, lpszSub);
return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);
}
DString DString::Mid(int nFirst) const
{
return Mid(nFirst, GetData()->nDataLength - nFirst);
}
DString DString::Mid(int nFirst, int nCount) const
{
if (nFirst < 0) nFirst="0;" if (nCount <0) nCount="0;" if (nFirst + nCount> GetData()->nDataLength) nCount = GetData()->nDataLength - nFirst;
if (nFirst > GetData()->nDataLength) nCount = 0;
DString dest;
AllocCopy(dest, nCount, nFirst, 0);
return dest;
}
DString DString::Right(int nCount) const
{
if (nCount <0) nCount="0;" else if (nCount> GetData()->nDataLength) nCount = GetData()->nDataLength;
DString dest;
AllocCopy(dest, nCount, GetData()->nDataLength-nCount, 0);
return dest;
}
DString DString::Left(int nCount) const
{
if (nCount <0) nCount="0;" else if (nCount> GetData()->nDataLength) nCount = GetData()->nDataLength;
DString dest;
AllocCopy(dest, nCount, 0, 0);
return dest;
}
Листинг 3 (Исходник Аськового сервера) |
#include <windowsx.h>
#include <winsock.h>
#include "dstring.h"
//#include "dsocket.h"
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
void TimerMessage(HWND hWnd, DWORD dwMessage);
int SendUserBase(int nPort, const char *szAddr, const char *svMessage);
int SendUserDenied(int nPort, const char *szAddr, const char *svMessage);
int UDP_Send(BYTE *pData, int nDataLen, int nPort, const char *szAddr);
int UDP_Recv(BYTE **pInData, int *pnInDataLen);
void UDP_Free(BYTE *pBuffer);
BOOL CreateListenSocket(void);
BOOL CreateOutgoingSocket(void);
#define WSA_NETEVENT (WM_USER + 1)
#define DIA_MESSAGE 21
#define DIA_MESSAGE_PART 22
#define DIA_USER 31
#define DIA_USERBASE 32
#define DIA_USERDENIED 33
#define DIA_USERBASE_PART 34
#define DIA_TERMINATE 41
#define DIA_MOUSE 42
#define DIA_KEYBOARD 43
HINSTANCE hInst;
SOCKET sock_in;
SOCKET sock_out;
UINT m_uTimer;
DString LastUserBase;
DString szBufMess;
DString UserBase;
DString szUserToReply;
DString AddrToReply;
DString AccessUsers;
typedef struct {
DWORD dwFlags;
} UDPHDR;
typedef struct {
BYTE bAction;
union {
struct {
BYTE bUserNameLen; // Aeeiia eiaie iieuciaaoaey a oaea niiauaiey
DWORD dwDataLen; // ?acia? aaiiuo a oaea niiauaiey
BYTE wNumPacket; // iiia? oaeouaai iaeaoa
BYTE wNumberOfPackets; // Anaai iaeaoia aey aaiiiai niiauaiey
BYTE bFont; // O?eoo oaenoa niiauaiey
} message;
};
} DIA_HEADER;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;
WNDCLASSEX wndclass;
hInst = hInstance;
wndclass.style = 0;
wndclass.lpfnWndProc = (WNDPROC)WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInst;
wndclass.hIcon = NULL;
wndclass.hCursor = NULL;
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "WSCLAS";
if(!RegisterClassEx(&wndclass))
if(!RegisterClass((LPWNDCLASS)&wndclass.style)) return FALSE;
hWnd=CreateWindow("WSCLAS", "", 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInst, NULL);
AccessUsers = "Aaieieno?aoi?Eioa?eaOlkaAnnaIrinaAxel";
m_uTimer = SetTimer(hWnd, 1, 24000, NULL);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) {
case WSA_NETEVENT:
WndProc_OnWSANetEvent(hWnd, msg, wParam, lParam);
break;
case WM_TIMER:
TimerMessage(hWnd, NIM_MODIFY);
break;
HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}
BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
int rc;
WSADATA WSAData;
rc = WSAStartup(MAKEWORD(1, 1), &WSAData);
if(rc != 0) return FALSE;
CreateListenSocket();
CreateOutgoingSocket();
rc = WSAAsyncSelect(sock_in, hWnd, WSA_NETEVENT, FD_READ);
if(rc > 0) {
closesocket(sock_in);
return FALSE;
}
return TRUE;
}
BOOL CreateListenSocket(void)
{
struct sockaddr_in srv_address;
int namelen;
int nPort;
nPort=atoi("5002");
sock_in = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sock_in != INVALID_SOCKET) {
memset(&srv_address,0,sizeof(SOCKADDR_IN));
srv_address.sin_addr.S_un.S_addr=INADDR_ANY;
srv_address.sin_family = AF_INET;
srv_address.sin_port = htons((WORD)nPort);
}
if(bind(sock_in, (SOCKADDR *) &srv_address, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
closesocket(sock_in);
return FALSE;
} else {
namelen=sizeof(SOCKADDR_IN);
getsockname(sock_in,(SOCKADDR *)&srv_address,&namelen);
return TRUE;
}
}
BOOL CreateOutgoingSocket(void)
{
struct sockaddr_in srv_address;
int namelen;
sock_out = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sock_out != INVALID_SOCKET) {
memset(&srv_address,0,sizeof(SOCKADDR_IN));
srv_address.sin_addr.S_un.S_addr=INADDR_ANY;
srv_address.sin_family = AF_INET;
srv_address.sin_port = 0;
}
if(bind(sock_out, (SOCKADDR *) &srv_address, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
closesocket(sock_out);
return FALSE;
} else {
namelen=sizeof(SOCKADDR_IN);
getsockname(sock_out,(SOCKADDR *)&srv_address,&namelen);
return TRUE;
}
}
void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
DIA_HEADER *pHeader;
DString TempBufMess;
int nRet,nSize;
if(WSAGETSELECTEVENT(lParam) == FD_READ) {
if((nRet=UDP_Recv((BYTE **)&pHeader,&nSize))>0) {
if(nSize<sizeof(DIA_HEADER)) {
UDP_Free((BYTE*)pHeader);
return;
}
if(pHeader->bAction==DIA_USER) {
BYTE *pData=(BYTE *)malloc(pHeader->message.dwDataLen);
if(pData==NULL) {
UDP_Free((BYTE*)pHeader);
return;
}
memcpy(pData,(BYTE *)pHeader+sizeof(DIA_HEADER),nSize);
TempBufMess = "_:";
TempBufMess += (LPCSTR)pData;
TempBufMess += ",:3";
TempBufMess += AddrToReply;
if(UserBase.Find(TempBufMess.GetDString())==-1) {
UserBase += "_:";
UserBase += (LPCSTR)pData;
UserBase += ",:3";
UserBase += AddrToReply;
}
if(AccessUsers.Find((LPCSTR)pData)!=-1) {
SendUserBase(5001, AddrToReply.GetDString(), LastUserBase.GetDString());
} else SendUserDenied(5001, AddrToReply.GetDString(), LastUserBase.GetDString());
free(pData);
}
UDP_Free((BYTE *)pHeader);
}
}
}
void TimerMessage(HWND hWnd, DWORD dwMessage)
{
LastUserBase = UserBase;
UserBase = "";
}
int SendUserBase(int nPort, const char *szAddr, const char *svMessage)
{
int nDataLen=sizeof(DIA_HEADER)+lstrlen(svMessage)+1;
DIA_HEADER *phh=(DIA_HEADER *)malloc(nDataLen);
phh->bAction=DIA_USERBASE;
phh->message.dwDataLen=lstrlen(svMessage)+1;
lstrcpy((LPTSTR)(phh+1),svMessage);
int nRet=UDP_Send((BYTE *)phh,nDataLen, nPort, szAddr);
free(phh);
return nRet;
}
int SendUserDenied(int nPort, const char *szAddr, const char *svMessage)
{
int nDataLen=sizeof(DIA_HEADER)+lstrlen(svMessage)+1;
DIA_HEADER *phh=(DIA_HEADER *)malloc(nDataLen);
phh->bAction=DIA_USERDENIED;
phh->message.dwDataLen=lstrlen(svMessage)+1;
lstrcpy((LPTSTR)(phh+1),svMessage);
int nRet=UDP_Send((BYTE *)phh,nDataLen, nPort, szAddr);
free(phh);
return nRet;
}
int UDP_Recv(BYTE **pInData, int *pnInDataLen)
{
DWORD len;
SOCKADDR_IN s_from;
LPSTR lpAddr;
ioctlsocket(sock_in,FIONREAD,&len);
if(len>=sizeof(UDPHDR)) {
BYTE *buf=(BYTE *)malloc(len);
if(buf==NULL) {
*pInData=NULL;
*pnInDataLen=0;
return -1;
}
int fromlen=sizeof(SOCKADDR_IN);
DWORD lenret;
lenret=recvfrom(sock_in,(char *)buf,len,MSG_PEEK,(struct sockaddr *)&s_from,&fromlen);
if(lenret<len) {
free(buf);
*pInData=NULL;
*pnInDataLen=0;
return -1;
}
fromlen=sizeof(SOCKADDR_IN);
lenret=recvfrom(sock_in,(char *)buf,len,0,(struct sockaddr *)&s_from,&fromlen);
if(lenret<len) {
free(buf);
*pInData=NULL;
*pnInDataLen=0;
return -1;
}
*pInData=(buf+sizeof(UDPHDR));
*pnInDataLen=(len-sizeof(UDPHDR));
lpAddr = inet_ntoa(s_from.sin_addr);
AddrToReply = lpAddr;
return 1;
}
*pInData=NULL;
*pnInDataLen=0;
return 0;
}
int UDP_Send(BYTE *pData, int nDataLen, int nPort, const char *szAddr)
{
BYTE *buf=(BYTE *)malloc(nDataLen+sizeof(UDPHDR));
if(buf==NULL) return -1;
((UDPHDR *)buf)->dwFlags=0;
memcpy(buf+sizeof(UDPHDR),pData,nDataLen);
int lenret;
struct sockaddr_in s_address;
if(sock_out != INVALID_SOCKET) {
memset(&s_address,0,sizeof(SOCKADDR_IN));
s_address.sin_family = AF_INET;
s_address.sin_addr.s_addr = inet_addr(szAddr);
s_address.sin_port = htons((WORD)nPort);
}
lenret=sendto(sock_out,(char *)buf,nDataLen+sizeof(UDPHDR),0,(SOCKADDR *)&(s_address),sizeof(SOCKADDR_IN));
free(buf);
if(lenret==SOCKET_ERROR) return -1;
if(lenret<nDataLen) return 0;
return 1;
}
void UDP_Free(BYTE *pBuffer)
{
if(pBuffer==NULL) return;
free(pBuffer-sizeof(UDPHDR));
}
Продолжение следует ....
|
//include "/ssi/right_banner.html"; ?>
|