|
TOP
|
|
基于Windows Socket的安全通信(C++实现,附源码)(二)
; 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); 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; 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)); 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 |
|