设为首页 加入收藏

TOP

基于Windows Socket的安全通信(C++实现,附源码)(二)
2015-07-24 05:41:45 来源: 作者: 【 】 浏览:20
Tags:基于 Windows Socket 安全 通信 实现 源码
; c->toClient = accept(c->Listener, (struct sockaddr *)&caddr, &caddrlen); if(c->toClient == INVALID_SOCKET)//异常处理 { if(!c->listening)return 0;//服务器端主动关闭,则直接退出 c->m_chat += "Connect Failed!\r\n"; c->UpdateData(false); return -1; } else { c->connected = true;//连接建立,另起线程用于接收信息 AfxBeginThread(ReceiveMessage, c); c->m_chat += "Client: "; c->m_chat += inet_ntoa(caddr.sin_addr); c->m_chat += " Connected!\r\n"; c->m_ip = inet_ntoa(caddr.sin_addr); c->UpdateData(false); } return 0; }

客户端只需要创建Socket并尝试与服务器连接

为“Connect/Disconnect”按钮注册单击事件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 void CTestSocketClientDlg::OnBtnConnect() { if(connected)//如果已连接,则断开 { connected = false; closesocket(toServer); m_chat += "Disconnect to Server!\r\n"; UpdateData(false); return; } UpdateData(true); //创建Socket struct protoent *ppe; ppe = getprotobyname("tcp"); if((toServer = socket(PF_INET, SOCK_STREAM, ppe->p_proto)) == INVALID_SOCKET) { m_chat += "Initialize Socket Listener Failed!\r\n"; UpdateData(false); return; } //尝试连接服务器 struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(m_port); saddr.sin_addr.s_addr = inet_addr(m_ip); if(connect(toServer, (struct sockaddr *)&saddr, sizeof(saddr))) { m_chat += "Connect Failed!\r\n"; UpdateData(false); return; } m_chat += "Server: "; m_chat += inet_ntoa(saddr.sin_addr); m_chat += " Connected!\r\n"; connected = true; UpdateData(false); AfxBeginThread(ReceiveMessage,this);//连接建立,另起线程用于接收信息 }

用于循环接收信息的线程

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 UINT ReceiveMessage(LPVOID pParam) { CTestSocketServerDlg * c = (CTestSocketServerDlg *) pParam; char buffer[1024]; int error;//记录recv函数返回值,即接收的字节数,也作异常代码 while(error = recv(c->toClient, buffer, 1024, 0)) { if(error == 0 || error == SOCKET_ERROR)break; c->PrintData("Received Data", (unsigned char*)buffer, error); c->aes.InvCipher((void *)buffer, error);//解密,恢复明文 c->PrintData("Unencrypted Data", (unsigned char*)buffer, error); c->m_chat += "Client:"; c->m_chat += buffer; c->m_chat += "\r\n"; c->UpdateData(false); } c->m_ip = "Not Connected..."; c->UpdateData(false); if(!c->connected)return 0;//服务器端主动关闭,直接返回 closesocket(c->toClient); c->connected = false; c->m_chat += "Client Disconnected...\r\n"; c->UpdateData(false); AfxBeginThread(Wait4Client, c); return 0; }

为“Send”按钮注册单击事件,处理数据的加密发送

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 void CTestSocketServerDlg::OnBtnSend() { if(!connected)return; UpdateData(true); if(m_message == "")return; int len = m_message.GetLength()+1 >= 1024 ? 1024 : m_message.GetLength()+1; len = len%16 ? len+16-len%16 : len; char buffer[1024]; strcpy(buffer,m_message.GetBuffer(0));//将message拷贝至buffer数组中 m_message.ReleaseBuffer(); PrintData("Input Data", (unsigned char*)buffer, len); aes.Cipher((void *)buffer);//对数据进行加密 if(send(toClient, buffer, len, 0) == SOCKET_ERROR)//发送密文 { m_chat += "Send Failed!(Socket Exception?)\r\n"; UpdateData(false); return; } PrintData("Encrypted Data", (unsigned char*)buffer, len); m_chat += "Server:" + m_message + "\r\n"; m_message =""; UpdateData(false); }

发送和接收的时候都用到了一个函数PrintData,用于将明文或密文以16进制输出以便作演示

1 2 3 4 5 6 7 8 9 10 11 12 13 14 void CTestSocketServerDlg::PrintData(char* title, unsigned char* buffer, int length) { int i; CString temp(""); m_chat += "("; m_c
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++智能指针--unique_ptr 下一篇C++智能指针--weak_ptr

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: