图4 启动主界面 内容来自论文无忧网 www.paper51.com 进行发送的,在发送时将会把信息发送给在局域网内部的所有用户包括自己。选择用户并输入发送信息,单播发送的按钮为BitBtn2,主要是通过Id UDP Server和Id UDP Client组件来编写的,由client. Send Buffer语句来发送的,主要是对局域网内部的同一工作组用户发送信息。 内容来自论文无忧网 www.paper51.com 广播发送的按钮为BitBtn3,主要是通过IdUDP Server和Id UDP Client组件来编写的,主要是使用了client. Broadcast来对信息,如图5所示: 内容来自论文无忧网 www.paper51.com
paper51.com 图5 用户选择图 内容来自论文无忧网 www.paper51.com 其中主要的代码为: copyright paper51.com void TMsgApp::InitWindow(void) copyright paper51.com { http://www.paper51.com WNDCLASS wc; paper51.com
HWND hWnd; 内容来自www.paper51.com char class_name[MAX_PATH]= IPMSG_CLASS, *tok, *msg, *p; copyright paper51.com
ULONG nicAddr= 0; 内容来自论文无忧网 www.paper51.com
int port_no= atoi(cmdLine); copyright paper51.com if(port_no == 0) paper51.com port_no= IPMSG_DEFAULT_PORT; http://www.paper51.com if((tok = strchr(cmdLine, '/')) && separate_token(tok, ' ', &p)) paper51.com { copyright paper51.com BOOL diag = TRUE; 内容来自www.paper51.com DWORD status =0xffffffff; 内容来自论文无忧网 www.paper51.com if(stricmp(tok, "/NIC") == 0) //NIC { paper51.com if(tok = separate_token(NULL, ' ', &p)) copyright paper51.com
nicAddr= ResolveAddr(tok); copyright paper51.com
} paper51.com
elseif (stricmp(tok, "/MSG") == 0) 内容来自论文无忧网 www.paper51.com { http://www.paper51.com MsgMng msgMng(nicAddr,port_no); copyright paper51.com ULONG command =IPMSG_SENDMSG|IPMSG_NOADDLISTOPT|IPMSG_NOLOGOPT, destAddr; paper51.com while((tok = separate_token(NULL, ' ', &p)) != NULL && *tok == '/') { 内容来自论文无忧网 www.paper51.com
if(stricmp(tok, "/LOG") == 0) 内容来自论文无忧网 www.paper51.com
command&= ~IPMSG_NOLOGOPT; http://www.paper51.com elseif (stricmp(tok, "/SEAL") == 0) paper51.com command= IPMSG_SECRETOPT; paper51.com } http://www.paper51.com if((msg = separate_token(NULL, 0, &p)) != NULL) 内容来自论文无忧网 www.paper51.com { copyright paper51.com diag= FALSE; copyright paper51.com if ((destAddr = ResolveAddr(tok)) !=NULL) 内容来自论文无忧网 www.paper51.com
status= msgMng.Send(destAddr, htons(port_no), command, msg) ? 0 : -1; paper51.com
} 内容来自www.paper51.com } http://www.paper51.com
if(nicAddr == 0) copyright paper51.com { 内容来自www.paper51.com if(diag) paper51.com MessageBox(0,"ipmsg.exe [portno] [/MSG [/LOG] [/SEAL] <hostname or IP addr><message>]\r\nipmsg.exe [portno] [/NIC nic_addr]", MSG_STR, MB_OK); paper51.com ::ExitProcess(status); paper51.com
return; copyright paper51.com } paper51.com
} 内容来自www.paper51.com copyright paper51.com
4.3.2文字聊天信息的封装 http://www.paper51.com 封装是一种把多次聊天的的数据捆绑在一起,使这两者不受外界干扰和误用的机制.封装可被理解为一种用做保护的包装器,以防止代码和数据被包装器外部所定义的其他代码任意访问.对包装器内部代码与数据的访问通过一个明确定义的接口来控制.封装代码的好处是每个人都知道怎样访问代码,进而无需考虑实现细节就能直接使用它,同时不用担心不可预料的副作用. 内容来自www.paper51.com 用户密封只需选择seal选项,程序插件自动生成封装功能。并且在聊天过程中,封装的过程仍在持续,聊天的内容是边封装数据包边传输。 内容来自www.paper51.com 密封发送信息接收界面,如图6所示 http://www.paper51.com
paper51.com
图6接收界面 copyright paper51.com 在点击open后显示信息。 http://www.paper51.com 其中实现的主要代码为: 内容来自www.paper51.com
BOOL TApp::PreProcMsg(MSG *msg) // for TranslateAccel & IsDialogMessage paper51.com { copyright paper51.com for(HWND hWnd=msg->hwnd; hWnd != NULL; hWnd=::GetParent(hWnd)) 内容来自论文无忧网 www.paper51.com { http://www.paper51.com TWin *win =SearchWnd(hWnd); http://www.paper51.com
if(win != NULL) copyright paper51.com return win->PreProcMsg(msg); http://www.paper51.com } copyright paper51.com
return FALSE; 内容来自论文无忧网 www.paper51.com } copyright paper51.com LRESULT CALLBACK TApp::WinProc(HWND hWnd, UINT uMsg,WPARAM wParam, LPARAM lParam) paper51.com
{ 内容来自论文无忧网 www.paper51.com TWin*win = SearchWnd(hWnd); http://www.paper51.com if(win) 内容来自www.paper51.com return win->WinProc(uMsg,wParam, lParam); http://www.paper51.com if((win = preWnd) != NULL) paper51.com { http://www.paper51.com preWnd= NULL; 内容来自www.paper51.com AddWinByWnd(win,hWnd); 内容来自论文无忧网 www.paper51.com return win->WinProc(uMsg,wParam, lParam); http://www.paper51.com } copyright paper51.com
return DefWindowProc(hWnd,uMsg, wParam, lParam); paper51.com
} 内容来自www.paper51.com
4.3.3 聊天信息的加锁 copyright paper51.com 加锁名如其实,其作用主要在于使传送的信息或者文件、文件夹只能给有password的用户看,从而加强了信息的安全程度。在现在这个网络黑客泛滥的时代,为了保护信息的隐私,加锁就更加必要了。以下为加锁信息的主要界面。 内容来自论文无忧网 www.paper51.com 在加锁后的信息接收界面,如图7所示: 内容来自论文无忧网 www.paper51.com http://www.paper51.com 图7聊天信息加锁后界面 内容来自论文无忧网 www.paper51.com 点击确定后显示,如图8所示: http://www.paper51.com 内容来自论文无忧网 www.paper51.com 图8开锁界面 内容来自www.paper51.com 其中主要代码为: 内容来自论文无忧网 www.paper51.com BOOLTRegistry::DeleteChildTree(LPSTR subKey) http://www.paper51.com { http://www.paper51.com char buf[100]; 内容来自论文无忧网 www.paper51.com
BOOL ret = TRUE; paper51.com if (subKey !=NULL && OpenKey(subKey) != TRUE) http://www.paper51.com return FALSE; http://www.paper51.com while (EnumKey(0,buf, sizeof(buf))) 内容来自论文无忧网 www.paper51.com
{ paper51.com if((ret = DeleteChildTree(buf)) != TRUE) copyright paper51.com break; 内容来自www.paper51.com } paper51.com if (subKey !=NULL) copyright paper51.com { copyright paper51.com CloseKey(); 内容来自论文无忧网 www.paper51.com ret= DeleteKey(subKey) ? ret : FALSE; http://www.paper51.com } paper51.com else { 内容来自www.paper51.com while(EnumValue(0, buf, sizeof(buf))) copyright paper51.com { http://www.paper51.com
if(DeleteValue(buf) != TRUE) copyright paper51.com
{ 内容来自www.paper51.com ret= FALSE; 内容来自论文无忧网 www.paper51.com break; 内容来自www.paper51.com } copyright paper51.com
} paper51.com } 内容来自论文无忧网 www.paper51.com return ret; 内容来自www.paper51.com } http://www.paper51.com 4.3.4文件传输的界面 内容来自www.paper51.com
与文字聊天一样,系统的文件、文件夹传输模块也尽量地要求简单易行,便于操作。当然,作为文件的传输,速度和安全也就成为了重要的问题,系统的简单加锁能达到局域网较为单一的环境要求。 paper51.com
文件传输的过程中流程为首先客端的主机通过TCP/IP协议建立链接,然后客户机发送套节字请求,通过3次握手连接响应,再转换数据为socket流传送,最近通过3次握手断开连接响应。 内容来自论文无忧网 www.paper51.com 选择用户并拖入相应所要传送的文件及文件夹,如图9所示: paper51.com http://www.paper51.com 图9 文件传输界面 http://www.paper51.com 点击所发送的文件为文件另存为,界面如图10所示: http://www.paper51.com
http://www.paper51.com 图10 选择存储路径 paper51.com 选择路径确定后,文件开始传输。其传送界面,如图11所示: paper51.com copyright paper51.com 图11文件传输中 http://www.paper51.com
实现的主要代码为: 内容来自www.paper51.com voidTSendDlg::InitializeHeader(void) copyright paper51.com { http://www.paper51.com
int order[MAX_SENDWIDTH]; http://www.paper51.com int revItems[MAX_SENDWIDTH]; 内容来自论文无忧网 www.paper51.com
while(maxItems > 0) 内容来自论文无忧网 www.paper51.com
SendDlgItemMessage(HOST_LIST,LVM_DELETECOLUMN, --maxItems, 0); copyright paper51.com ColumnItems= cfg->ColumnItems & ~(1 << SW_ABSENCE); copyright paper51.com memcpy(FullOrder,cfg->SendOrder, sizeof(FullOrder)); 内容来自www.paper51.com
for(int cnt=0; cnt < MAX_SENDWIDTH; cnt++) { http://www.paper51.com if(GetItem(ColumnItems, cnt)) { paper51.com items[maxItems]= cnt; copyright paper51.com revItems[cnt]= maxItems++; 内容来自www.paper51.com } paper51.com } paper51.com int orderCnt= 0; 内容来自www.paper51.com
for(cnt=0; cnt < MAX_SENDWIDTH; cnt++) { copyright paper51.com
if(GetItem(ColumnItems, FullOrder[cnt])) http://www.paper51.com order[orderCnt++]= revItems[FullOrder[cnt]]; 内容来自论文无忧网 www.paper51.com } paper51.com
DWORDdw = ::GetWindowLong(GetDlgItem(HOST_LIST), GWL_STYLE) | LVS_SHOWSELALWAYS; paper51.com ::SetWindowLong(GetDlgItem(HOST_LIST),GWL_STYLE, dw); 内容来自论文无忧网 www.paper51.com DWORDstyle = SendDlgItemMessage(HOST_LIST, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) |LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP; paper51.com if(cfg->GlidLineCheck) http://www.paper51.com style|= LVS_EX_GRIDLINES; paper51.com
else 内容来自www.paper51.com style&= ~LVS_EX_GRIDLINES; copyright paper51.com SendDlgItemMessage(HOST_LIST,LVM_SETEXTENDEDLISTVIEWSTYLE, 0, style); 内容来自论文无忧网 www.paper51.com
staticchar *headerStr[MAX_SENDWIDTH]; 内容来自www.paper51.com |