![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**//* ========================================================================
Copyright (c) 2010,
All rights reserved.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
|文件名称|:CommSocket.h
|文件标识|:通信模块
|摘 要|: 封装了在套接字上的各种通信操作。
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
|当前版本|:
|作 者|:张涛
|完成日期|:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
|取代版本|:
|原 作 者|:张涛
|完成日期|:
======================================================================== */
#pragma once
extern "C"
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
__declspec(dllexport) void __stdcall CommSocketInit();
__declspec(dllexport) void __stdcall CommSocketDestroy();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
__declspec(dllexport) HANDLE __stdcall CommSocketCreate( UINT nSocketPort , int nSocketType,LPCTSTR lpszSocketAddress );
__declspec(dllexport) HANDLE __stdcall CommSocketAccept(HANDLE hCommSocket, LPSTR lpSockAddr,UINT *nPort);
__declspec(dllexport) BOOLEAN __stdcall CommSocketConnect( HANDLE hCommSocket,LPCTSTR lpszHostAddress, UINT nHostPort );
__declspec(dllexport) BOOLEAN __stdcall CommSocketListen(HANDLE hCommSocket, int nConnectionBacklog );
__declspec(dllexport) int __stdcall CommSocketSend( HANDLE hCommSocket,const void* lpBuf, int nBufLen, int nFlags );
__declspec(dllexport) int __stdcall CommSocketReceive(HANDLE hCommSocket, void* lpBuf, int nBufLen, int nFlags );
__declspec(dllexport) int __stdcall CommSocketGetLastError();
__declspec(dllexport) void __stdcall CommSocketClose(HANDLE hCommSocket);
};
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketInit
//功能: 初始化套接字,加载sock库
//参数: 无
//返回值:无
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名: CommSocketDestroy
//功能: 卸载Socks库
//参数: 无
//返回值:无
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名:CommSocketCreate
//功能: 创建一个指定类型和地址的套接字
//参数:
// [IN] UINT nSocketPort // 端口号
// [IN] int nSocketType // 套接字类型
// [IN] LPCTSTR lpszSocketAddress //IP地址
//返回值:
// 创建成功返回一个指向套接字的句柄,失败返回INVALID_SOCKET_HANDLE
//引用函数:
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名: CommSocketAccept
//功能: 接受远程连接
//参数:
// [IN] HANDLE hCommSocket //指向本地监听套接字的句柄
// [IN] LPSTR lpSockAddr //客户端主机IP
// [IN] UINT *nPort //客户端进程PORT
//返回值:
// 接受成功返回一个指向专门用于IO处理的套接字句柄,
// 否则返回INVALID_SOCKET_HANDLE
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名:CommSocketListen
//功能: 监听连接请求
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] int nConnectionBacklog //最大连接队列长度
//返回值:
// BOOL
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名:CommSocketConnect
//功能: 请求连接到服务器
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] LPCTSTR lpszHostAddress//服务器IP
// [IN] UINT nHostPort//服务port
//返回值:
// BOOL
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名:CommSocketSend
//功能: 发送 数据
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] const void* lpBuf //指向发送缓冲区的指针
// [IN] int nBufLen // 发送数据的长度
// [IN] int nFlags // 标准位
//返回值:
// int,返回已发送的字节数
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名:CommSocketReceive
//功能: 发送 数据
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] const void* lpBuf //指向发送缓冲区的指针
// [IN] int nBufLen // 发送数据的长度
// [IN] int nFlags // 标准位
//返回值:
// int,返回已接收的字节数
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名:CommSocketGetLastError
//功能: 获取上次错误代码
//参数:
//返回值:int 错误代码值
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
////////////////////////////////////////////////////////////////////////// //函数名:CommSocketClose
//功能: 关闭套接字,回收套接字资源
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
//返回值:无
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**///////////////////////////////////////////////////////////////////////////
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//////////////////////////////////////////////////////////////////////// //测试用例
//Sample
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //BOOL Sample(void)
//{
//
// CCommSocket testSocket;
// BOOL bCreate = testSocket.Create(8888);
// if (!bCreate)
// {
// return FALSE;
// }
//
// BOOL nListen= testSocket.Listen();
// if (!nListen)
// {
// return FALSE;
// }
//
// CCommSocket ioSocket ;
// char szIP[20] ={0};
// UINT nPort = 0;
// BOOL bAccept =testSocket.Accept(ioSocket,szIP,&nPort);//阻塞处
// if (!bAccept)
// {
// return FALSE;
// }
//
// char szBuf[10]="test";
// int nSend = ioSocket.Send(szBuf,sizeof(szBuf));
// if (nSend < 0)
// {
// return FALSE;//BUG 2010-09-08
// }
//
// int nReceive = ioSocket.Receive(szBuf,sizeof(szBuf));
// if (nReceive < 0)
// {
// return FALSE;
// }
//
// ioSocket.Close();
// testSocket.Close();
// return TRUE;
//
//}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CommSocket.cpp : Defines the exported functions for the DLL application.
//
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "stdafx.h"
#include "CommSocket.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
typedef struct _PSOCKET_HANDLE
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
SOCKET m_socket;
} SOCKET_HANDLE,*PSOCKET_HANDLE;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名: CommSocketInit
//功能: 加载Socks库
//参数: 无
//返回值:无
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// void __stdcall CommSocketInit()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
WSACleanup( );
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
WORD wVersionRequested;
WSADATA wsaData;
int err;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
WSACleanup( );
return;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名: CommSocketDestroy
//功能: 卸载Socks库
//参数: 无
//返回值:无
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// void __stdcall CommSocketDestroy()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
WSACleanup( );
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketCreate
//功能: 创建一个指定类型和地址的套接字
//参数:
// [IN] UINT nSocketPort // 端口号
// [IN] int nSocketType // 套接字类型
// [IN] LPCTSTR lpszSocketAddress //IP地址
//返回值:
// 创建成功返回一个指向套接字的句柄,失败返回INVALID_SOCKET_HANDLE
//引用函数:
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// HANDLE __stdcall CommSocketCreate( UINT nSocketPort , int nSocketType,LPCTSTR lpszSocketAddress )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
PSOCKET_HANDLE pHandle = NULL;
do
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
SOCKET sock = socket(AF_INET,nSocketType,IPPROTO_IP);
if(INVALID_SOCKET==sock)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
break;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) sockaddr_in sa= {AF_INET};
sa.sin_port=htons(nSocketPort);
sa.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int nRet = bind(sock,(sockaddr *)&sa,sizeof(sa));
int n = WSAGetLastError();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (SOCKET_ERROR == nRet)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
break;
}
pHandle = new SOCKET_HANDLE;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pHandle->m_socket = sock;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
} while (0);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return pHandle;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名: CommSocketAccept
//功能: 接受远程连接
//参数:
// [IN] HANDLE hCommSocket //指向本地监听套接字的句柄
// [IN] LPSTR lpSockAddr //客户端主机IP
// [IN] UINT *nPort //客户端进程PORT
//返回值:
// 接受成功返回一个指向专门用于IO处理的套接字句柄,
// 否则返回INVALID_SOCKET_HANDLE
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// HANDLE __stdcall CommSocketAccept(HANDLE hCommSocket, LPSTR lpSockAddr,UINT *nPort)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
PSOCKET_HANDLE pIOHandle = new SOCKET_HANDLE;
PSOCKET_HANDLE pHandle = (PSOCKET_HANDLE)hCommSocket;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) sockaddr_in sa= {AF_INET};//客户套接字地址
int nLen=sizeof(sa);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pIOHandle->m_socket = accept(pHandle->m_socket,(sockaddr*)&sa,&nLen);
if(INVALID_SOCKET==pIOHandle->m_socket)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
pIOHandle = NULL;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if(lpSockAddr)
strcpy(lpSockAddr,inet_ntoa(sa.sin_addr));
if(nPort)
*nPort=htons(sa.sin_port);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return pIOHandle;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketConnect
//功能: 请求连接到服务器
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] LPCTSTR lpszHostAddress//服务器IP
// [IN] UINT nHostPort//服务port
//返回值:
// BOOL
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// BOOLEAN __stdcall CommSocketConnect( HANDLE hCommSocket,LPCTSTR lpszHostAddress, UINT nHostPort )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
BOOLEAN bResult = FALSE;
PSOCKET_HANDLE pHandle = (PSOCKET_HANDLE)hCommSocket;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) sockaddr_in sa = {AF_INET};
sa.sin_port = htons(nHostPort);
sa.sin_addr.s_addr =inet_addr((PCSTR)lpszHostAddress);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int nlen = sizeof(sa);
int err=connect(pHandle->m_socket,(sockaddr*)&sa,sizeof(sa));
if(SOCKET_ERROR != err)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
bResult = TRUE;
}
return bResult;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketListen
//功能: 监听连接请求
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] int nConnectionBacklog //最大连接队列长度
//返回值:
// BOOL
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// BOOLEAN __stdcall CommSocketListen(HANDLE hCommSocket, int nConnectionBacklog )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
PSOCKET_HANDLE pHandle = (PSOCKET_HANDLE)hCommSocket;
return !listen(pHandle->m_socket,nConnectionBacklog);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketSend
//功能: 发送 数据
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] const void* lpBuf //指向发送缓冲区的指针
// [IN] int nBufLen // 发送数据的长度
// [IN] int nFlags // 标准位
//返回值:
// int,返回已发送的字节数
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// int __stdcall CommSocketSend( HANDLE hCommSocket,const void* lpBuf, int nBufLen, int nFlags )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
PSOCKET_HANDLE pHandle = (PSOCKET_HANDLE)hCommSocket;
return send(pHandle->m_socket, (LPSTR)lpBuf, nBufLen, nFlags);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketReceive
//功能: 发送 数据
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
// [IN] const void* lpBuf //指向发送缓冲区的指针
// [IN] int nBufLen // 发送数据的长度
// [IN] int nFlags // 标准位
//返回值:
// int,返回已接收的字节数
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// int __stdcall CommSocketReceive(HANDLE hCommSocket, void* lpBuf, int nBufLen, int nFlags )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
PSOCKET_HANDLE pHandle = (PSOCKET_HANDLE)hCommSocket;
return recv(pHandle->m_socket, (LPSTR)lpBuf, nBufLen, nFlags);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketGetLastError
//功能: 获取上次错误代码
//参数:
//返回值:int 错误代码值
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// int __stdcall CommSocketGetLastError()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
return WSAGetLastError();
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// //函数名:CommSocketClose
//功能: 关闭套接字,回收套接字资源
//参数:
// [IN] HANDLE hCommSocket //套接字句柄
//返回值:无
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) /**/////////////////////////////////////////////////////////////////////////// void __stdcall CommSocketClose(HANDLE hCommSocket)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
PSOCKET_HANDLE pHandle = (PSOCKET_HANDLE)hCommSocket;
closesocket(pHandle->m_socket);
pHandle->m_socket = INVALID_SOCKET;
delete pHandle;
pHandle = NULL;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 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 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
常用链接
留言簿(3)
随笔分类(81)
随笔档案(86)
文章分类(34)
文章档案(37)
c++博客
技术论坛
网络安全和黑客技术
资源
搜索
积分与排名
最新评论
![](/images/xml.gif)
阅读排行榜
评论排行榜
|
|