- 博客(16)
- 资源 (16)
- 收藏
- 关注
原创 boost网络编程(2)
连接刚建立时,立即调用write_some写数据会不成功,对此我的解决办法是用async_write代替write_some函数,用async_write注册一个回调函数,检查write是否成功,不成功则再次调用async_write,这样循环知道写成功为止。 还需要注意的地方就是无论调用async_read还是async_write传递给的buffer参数一定要是new...
2013-12-25 11:55:13 635
原创 boost网络编程(1)
用boost进行网络编程,一般都会对底层进行封装,client,server之类的对象。 前面的5步完了之后,需要注意的就是传输过程,以及数据打包的问题。TCP数据传输都是字节流,顺序不会变,但是传的包不能保证一次收到。所以接收端就需要考虑拼包的问题。对于这个boost提供了很好的支持。 async_read,这个异步读取函数,这个函数能够在没有收到制定字节数数据时不返回。
2013-12-24 18:20:15 784
原创 boost网络编程一般需要的五步
第一,引入头文件和库文件,这个一定需要的,否则编译都不通过第二,声明一个全局的,或类成员变量的io_service对象,这是整个异步事件的根基,如果这个变量没了,所有异步事件都会出错第三,声明一个socket,这个socket需要io_service对象作为参数,因为socket要用来进行异步通信,所以少不了io_service这个根基第四,客户端跳过,服务端需要一个acceptor对
2013-12-23 19:07:23 1124
原创 boost::asio::socket::async_read_some
记录下今天发现的一个问题void CBoostSocket::connect_hander(const boost::system::error_code& err){if (err){return;}vector* buf = new vector(100,0);m_Sock.async_read_some(buffer(*buf),boost::bind(&
2013-12-20 16:21:42 5585
原创 boost::bind
bind的可以办到的两件事: 包装一个带有实参的函数 template void work(T func) {T f = func;f(); } void print(int n,int m) {cout } int _tmain(int argc, _TCHAR* argv[]) {
2013-12-19 10:53:11 614
原创 boost::asio::socket
boost的网络层在windows平台下是用iocp实现的,boost为了能够实现异步,实际上是利用了回调机制,就是在凡是会阻塞程序的函数accpet,recv,send中加入了一个回调函数作为参数,这样,程序尽管执行,所有其他操作由回调来完成,相对于boost中同步函数accept,read_some,write_some.在相对应的异步调用函数async_accept,async_read_s
2013-12-18 15:54:50 795
原创 boost::bind\boost::function
boost::function就是C++中的函数对象 一般的定义方法 : typedef boost::function func; func object;//定义了一个有两个int参数和一个void返回值的函数 在将func类型的函数对象当做参数传递时,需要用boost::bind来将函数打包成function函数对象后传入 比如函数: void Print(
2013-12-18 10:26:06 646
原创 boost::thread
boost::thread最简单的使用 #pragma comment(lib, "E:\\Boost\\lib\\libboost_thread-vc90-mt-sgd-1_54.lib") #pragma comment(lib, "E:\\Boost\\lib\\libboost_date_time-vc90-mt-sgd-1_54.lib") #pragma comment(
2013-12-17 15:25:40 1208
翻译 ASIO
基本了解 大多数程序员有很多种方式与其他程序打交道,文件,网络吗,串口,控制台等等。有时网络一个单独的IO操作需要很久才能完成。这给网络编程带来了很大的挑战。 Boost.Asio库提供很多工具用于管理这些耗时长的操作,而且不需要基于线程和锁的并发模型。 Boost.Asio库是为使用C++进行系统编程的程序员准备的,因为他们经常会需要网络。特别说明
2013-12-17 14:41:11 628
原创 SHUnicodeToAnsi SHAnsiToUnicode
这两个shell api用于unicode和ansi之间的转化非常方便用法 : wchar_t* p =L"ddx";char buf[10] = {0};SHUnicodeToAnsi(p,buf,10);但是微软官方说有可能取消这两个API,win7上是可以用的,不知道Win8可用否。不过这个实在比MultiByteToWideChar方便了太
2013-12-11 17:03:26 1715
原创 SHGetFileInfo
SHGetFileInfo用于获取文件,文件夹,或者磁盘的信息用法: SHFILEINFO info = {0}; SHGetFileInfo("D:\\book",0,&info,sizeof(info),SHGFI_TYPENAME|SHGFI_DISPLAYNAME|SHGFI_ICON); SHGFI_TYPENAME 获取类型信息,比如 文件夹 S
2013-12-11 15:24:53 1553
原创 Shell_NotifyIcon
这个shell api是给桌面右下角的任务状态栏发消息的,一般给程序添加托盘就是用这个函数来做。用法: 1.添加托盘图标 NOTIFYICONDATA ndata = {0};ndata.cbSize = sizeof(ndata);ndata.hIcon = m_hIcon; //要添加的图标ndata.uFlags = NIF_MESSAGE|NIF_
2013-12-11 14:36:18 2045
原创 SHGetKnownFolderIDList
此shell api用于获取特殊位置文件夹的路径,比如桌面,common,我的文档等等。与此相似的有SHGetSpecialFolderLocation,SHGetFolderLocation,但是微软已经不建议使用这两个shell api了,他们的存在只是为了兼容vista之前的系统。SHGetKnownFolderIDList 的用法:ITEMIDLIST* pID
2013-12-11 11:28:28 1845
原创 SHParseDisplayName
这个shell api可以将普通的字串路径转换为shell 路径包装在ITEMIDLIST结构体当中,这个转换函数非常有用,因为在很多shell api中使用的并不是普通的字串路径,而是shell 路径,比如SHChangeNotifyRegister这个用来注册接收文件夹/文件修改消息函数中,监听的文件路径就是由shell 路径提供的SHParseDisplayName的用法:
2013-12-11 11:03:41 2718
原创 SHBrowseForFolder
SHBrowseForFolder最简单的用法char path[MAX_PATH] = {0};BROWSEINFO bi;ZeroMemory(&bi,sizeof(bi));bi.ulFlags = BIF_BROWSEINCLUDEFILES;LPITEMIDLIST pList = ::SHBrowseForFolder(&bi); if(pList
2013-12-10 17:53:24 1021
原创 SHFileOperation操作文件
用SHFileOperation来操作文件时非常方便,比用其他的MoveFile,CopyFile之类的API要统一很多,但是在填写路径时要特别注意 char* From = "E:\\PS.txt\\\0"; \\字符串的结尾一定是需要\\\0这样一个串,否则操作会失败,微软的 文档上面说是这个参数是可以写入多个路径的
2013-12-10 17:27:00 844
编译好的CPPCMS库
2015-11-05
图片拼接工具
2013-06-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人