VC++写的socket通信程序发送的信息用des加密然后在收到信息后解密
。]有一个简单的VC++写的socket通信程序,如何将发送的信息用des加密然后在收到信息后解密。求大神给个说明和des代码。scoket服务器和客户端代码如下,如何加入des模块:
服务器端程序:
//sockServ.cpp
#include <iostream>
#include <Windows.h>
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
using namespace std;
#define PORT 4000
//#define IP_ADDRESS "192.168.1.145"
#define IP_ADDRESS "127.0.0.1"
DWORD WINAPI ClientThread(LPVOID lpParameter)
{
SOCKET CientSocket = (SOCKET)lpParameter;
int Ret = 0;
char RecvBuffer[MAX_PATH];
char SendBuffer[MAX_PATH];
while ( true )
{
memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
if ( Ret == 0 || Ret == SOCKET_ERROR )
{
cout<<"客户端退出!"<<endl;
break;
}
cout<<"接收到客户信息为:"<<RecvBuffer<<endl;
//服务器端发送信息
cout<<"服务器端向客户端发送!:"<<endl;
cin.getline(SendBuffer, sizeof(SendBuffer));
Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
if ( Ret == SOCKET_ERROR )
{
cout<<"Send Info Error::"<<GetLastError()<<endl;
break;
}
}
return 0;
}
int main(int argc, char* argv[])
{
WSADATA Ws;
SOCKET ServerSocket, CientSocket;
struct sockaddr_in LocalAddr, ClientAddr;//sockaddr_in是TCP/IP使用的数据结构
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
//Init Windows Socket
if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )//socket使用2.2版本的
{
cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
return -1;
}
ServerSocket = socket(AF_INET, SOCK_STREAM, 0);
//ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( ServerSocket == INVALID_SOCKET )
{
cout<<"Create Socket Failed::"<<GetLastError()<<endl;
return -1;
}
LocalAddr.sin_family = AF_INET;//INTERNET协议簇
//LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
LocalAddr.sin_addr.S_un.S_addr = INADDR_ANY;
LocalAddr.sin_port = htons(PORT);
memset(LocalAddr.sin_zero, 0x00, 8);
//Bind Socket
Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
if ( Ret != 0 )
{
cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
return -1;
}
Ret = listen(ServerSocket, 10);//用ServerSocket来进行监听,监听最多10个客户端的请求
if ( Ret != 0 )
{
cout<<"listen Socket Failed::"<<GetLastError()<<endl;
return -1;
}
cout<<"服务端已经启动"<<endl;
while ( true )//因为是服务器端,要不停的监听客户端的请求
{
AddrLen = sizeof(ClientAddr);
//用CientSocket来进行通信
CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
if ( CientSocket == INVALID_SOCKET )
{
cout<<"Accept Failed::"<<GetLastError()<<endl;
break;
}
cout<<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);
if ( hThread == NULL )
{
cout<<"Create Thread Failed!"<<endl;
break;
}
CloseHandle(hThread);
}
closesocket(ServerSocket);
closesocket(CientSocket);
WSACleanup();
return 0;
}
客户端代码如下:
//sockCli.cpp
#include <iostream>
#include <Windows.h>
using namespace std;
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
#define PORT 4000
//#define IP_ADDRESS "192.168.1.145"
#define IP_ADDRESS "127.0.0.1"
int main(int argc, char* argv[])
{
WSADATA Ws;
SOCKET CientSocket;
struct sockaddr_in ServerAddr;
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
char SendBuffer[MAX_PATH];
char RecvBuffer[MAX_PATH];
//Init Windows Socket
if ( WSAStartup(MAKEWORD(1,1), &Ws) != 0 )//客户端用的SOCKET库的版本和服务器端一样,就算不一样,也可以正常通信
{
cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
return -1;
}
//Create Socket
CientSocket = socket(AF_INET, SOCK_STREAM, 0);//创建了一个客户端的SOCKET
if ( CientSocket == INVALID_SOCKET )
{
cout<<"Create Socket Failed::"<<GetLastError()<<endl;
return -1;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
ServerAddr.sin_port = htons(PORT);
memset(ServerAddr.sin_zero, 0x00, 8);
//连接到服务器,连接的服务器的地址在上面中设定
Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
if ( Ret == SOCKET_ERROR )
{
cout<<"Connect Error::"<<GetLastError()<<endl;
return -1;
}
else
{
cout<<"连接成功!"<<endl;
}
while ( true )
{
cout<<"客户端,发送!:"<<endl;
cin.getline(SendBuffer, sizeof(SendBuffer));
//向服务器端发送数据
Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
if ( Ret == SOCKET_ERROR )
{
cout<<"Send Info Error::"<<GetLastError()<<endl;
break;
}
memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
//从服务器端接收数据
Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
if ( Ret == 0 || Ret == SOCKET_ERROR )
{
cout<<"客户端退出!"<<endl;
break;
}
cout<<"接收到服务器信息为:"<<RecvBuffer<<endl;
}
closesocket(CientSocket);
WSACleanup();
return 0;
}
相关推荐
基于DES加解密的Socket聊天程序代码
本文介绍了一个基于Java的DES加密解密工具类,实现了生成密钥、字符串加密解密等功能,并构建了一个简单的聊天程序,包括客户端和服务器端。客户端支持消息的发送和接收,服务器端负责处理连接请求和消息加密
深入解析OpenSSL动态库:从libcrypto与libssl原理到Windows部署实践
动态链接库(DLL)是Windows系统中实现代码复用与模块化的重要机制,其通过动态加载与链接,为应用程序提供共享功能模块。在网络安全领域,SSL/TLS协议是保障数据传输安全的基石,而OpenSSL作为其广泛使用的开源实现,其核心功能由libcrypto与libssl两个关键动态库承载。libcrypto作为加密算法基础库,提供了对称加密、非对称加密、哈希函数等密码学原语;libssl则在此基础上实现了完整的SSL/TLS协议栈,负责安全通信的握手与会话管理。理解这两个库的职责边界与协作原理,对于解决因版
Socket通信Des加密笔记
1.3 Socket通信及Des之CBC加密解密完整源码:源码通常包括服务器端和服务客户端的Java代码,分别实现Socket连接的建立、数据加密解密、接收发送数据等功能。
C# Socket传输加密文件并解密(WinForm版)
这是我用C#编写的基于Socket网络编程技术,在网络上传输加密文件,并对其进行数字签名,在另一端进行解密,并验证签名的一个WinForm程序,里面涉及到的加密解密算法有对称密码算法DES和非对称密码
基于客户端通信的DES加密的java实现
在DES加密的客户端通信中,我们需要在数据发送前对其进行加密,并在接收后进行解密。以下是一般的步骤:1. **密钥生成**:在客户端和服务器端,我们都需要生成相同的DES密钥。


