设为首页 加入收藏

TOP

基于Windows Socket的安全通信(C++实现,附源码)(一)
2015-07-24 05:41:45 来源: 作者: 【 】 浏览:14
Tags:基于 Windows Socket 安全 通信 实现 源码

先了解一下Socket的相关函数原型

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //加载套接字库 int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); //释放套接字库资源 int PASCAL FAR WSACleanup(void); //创建套接字 SOCKET PASCAL FAR socket (int af,int type,int protocol); //关闭套接字 int PASCAL FAR closesocket (SOCKET s); //绑定一个IP地址和端口 int PASCAL FAR bind (SOCKET s, const struct sockaddr FAR *addr, int namelen); //将套接字置为监听状态 int PASCAL FAR listen (SOCKET s, int backlog); //接受客户端连接请求,并返回新创建的套接字 SOCKET PASCAL FAR accept (SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen); //尝试将本地套接字连接至服务器 int PASCAL FAR connect (SOCKET s, const struct sockaddr FAR *name, int namelen); //发送数据 int PASCAL FAR send (SOCKET s, const char FAR * buf, int len,int flags); //接收数据 int PASCAL FAR recv (SOCKET s, char FAR * buf, int len,int flags);

使用Socket的程序在使用Socket之前必须调用WSAStartup函数来绑定Socket库

在Constructor中添加如下代码

1 2 3 4 5 6 7 8 9 int error; WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 1);//加载2.1版本的Socket库 if(error = WSAStartup(wVersionRequested, &wsaData)) { AfxMessageBox("Link Socket Library Failed!"); exit(0); }

应用程序完成对Socket的使用后应当调用WSACleanup函数来释放Socket库占用的系统资源

在析构函数冲添加如下代码

1 WSACleanup();

Socket通信流程

实现安全通信,应采用面向连接的TCP/IP协议来保证连接的可靠性

面向连接的套接字的系统调用时序图

\

添加成员变量及初始化

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 //服务器端:   SOCKET Listener,toClient;//用于监听的套接字和连接至客户端的套接字(只是为了实现通信模型,所以不考虑多客户端)   bool listening, connected;//指示监听和连接的状态   AES aes;//加密/解密模块 CTestSocketServerDlg::CTestSocketServerDlg(CWnd* pParent): CDialog(CTestSocketServerDlg::IDD, pParent), aes((unsignedchar *)"0123456789abcdef"), listening(false), connected(false) { //Constructor of Server } //客户端:   SOCKET toServer;//连接至服务器端的套接字   bool connected;//指示连接状态   AES aes;//加密/解密模块 CTestSocketClientDlg::CTestSocketClientDlg(CWnd* pParent): CDialog(CTestSocketClientDlg::IDD, pParent), aes((unsignedchar *)"0123456789abcdef"), connected(false) { //Constructor of Client }

为“Start/Stop”按钮注册单击事件处理服务器端初始化及关闭操作

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 40 41 42 43 44 45 46 47 48 void CTestSocketServerDlg::OnBtnStart() { if(connected || listening)//若正在监听或已连接则关闭服务器 { connected = false; listening = false; closesocket(toClient); closesocket(Listener); m_chat += "Socket Server Stopped!\r\n"; UpdateData(false); return; } UpdateData(true); //创建监听Socket struct protoent *ppe; ppe = getprotobyname("tcp"); if((Listener = socket(PF_INET, SOCK_STREAM, ppe->p_proto)) == INVALID_SOCKET) { m_chat += "Initialize Socket Listener Failed!\r\n"; UpdateData(false); return; } //绑定IP及端口 struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(m_port); saddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(Listener, (struct sockaddr *)&saddr, sizeof(saddr))) { m_chat += "Bind to IPEndPoint Failed! (Port in use?)\r\n"; UpdateData(false); return; } //开始监听,队列长度1(不考虑多客户端) if(listen(Listener, 1)) { m_chat += "Listen Failed!\r\n"; UpdateData(false); return; } m_chat += "Socket Server Started!\r\n"; UpdateData(false); listening = true; AfxBeginThread(Wait4Client,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 Wait4Client(LPVOID pParam) { CTestSocketServerDlg * c = (CTestSocketServerDlg *) pParam; struct sockaddr_in caddr; int caddrlen = sizeof(caddr)
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++智能指针--unique_ptr 下一篇C++智能指针--weak_ptr

评论

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