自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 资源 (1)
  • 收藏
  • 关注

原创 类的直接构造和拷贝构造

先看代码:#include using namespace std;class A{public: A(int k): m_k(k) { } A(const A&a): m_k(a.m_k) { cout << "copy ctor" << endl; }private: int m_k;};int main(){ A a1(1);

2012-02-16 13:03:27 824

原创 模拟C++11的新关键字decltype

只上代码了,尽在不言中吧:#include #include #include #include using namespace std;template struct decltype_t { typedef T type; }; #define DECLTYPE(expr) decltype_t::type int main(){ std::map m

2012-01-20 21:12:41 1284

原创 完成端口GetQueuedCompletionStatus()返回错误,怎样获得真正的错误代码

GetQueuedCompletionStatus()返回错误,说明I/O失败。此时调用GetLastError()得到的往往是ERROR_NETNAME_DELETED(64),WSAGetLastError()也一样,这显然不是真正的错误代码,那么怎么得到真正的错误代码呢?给出下面的代码:int YourIOCPClass::GetSockError(WSAOVERLAPPED* pW

2012-01-12 17:01:18 5619 2

原创 IOCP如何既能发送RST复位连接避免TIME_WAIT状态,又能重用socket?

待续

2012-01-12 13:49:14 2017

原创 如何在应用层控制TCP三次握手的过程

1

2012-01-12 13:48:12 1445 1

原创 调用closesocket()背后发生的事

应用层代码想要关闭一个TCP连接可以直接调用closesocket(),但是这个函数的行为并不“单纯”,只有了解closesocket()背后的故事,才能对关闭TCP连接有正确的认识。首先明确一点:任何情况下,调用closesocket之后,socket句柄立即失效(一种情况除外,见下文),再对该socket进行操作的API都会失败。但是socket句柄对应的系统资源不一定立即释放,由内核控制

2012-01-12 13:38:29 12166 1

原创 TCP连接的关闭

这是我自己总结的TCP连接关闭是几种情形,不保证正确性与全面性,假定A端和B端通信:1、双方四次握手的过程;2、A端半关闭,经过一段时间,B端数据发送完毕并被A端确认,B端半关闭,A端进入TIME_WAIT状态;3、A端或B端主动直接RST;4、保活定时器启动:B端停止响应(路由故障,对方主机崩溃、重启,网线被拔等等),迫使A端保活定时器启动,2个小时(具体由协议栈实现)之后B端仍

2012-01-12 10:46:04 1510

原创 有符号数的向左位移运算

今天忽然想到的,有符号数的左移是怎么处理的。查了一些资料,原来左移就是简单的把数字的2进制表示的最左边若干位抛弃掉,同时把剩余的位向左移动,空出来的位置用0补上即可。有符号数、无符号数都是这样的。特别的,有符号数左移之后的正负取决于左移之后的符号位,就是说有符号数左移之后的正负是不确定的,和左移的位数有关系。还有,float和double是不能做位移运算的(这不废话嘛!)。

2012-01-09 19:43:27 4901 1

原创 配接器ptr_fun的一点增补

ptr_fun的作用是什么?就是把函数(函数的参数最多有两个,返回值类型任意,包括void)转成函数对象,并使该函数对象可配接。当和bind1st或者bind2nd结合使用的时候,ptr_fun作用的函数的参数类型会有限制:不能是引用类型

2012-01-09 12:21:56 874 1

原创 无聊的细节:指针、引用、右值

先看代码:int i;int*& ii = &i;我想定义一个int*的引用ii。但是上面的代码不能编译,因为&i是个右值,不能被引用(只能引用左值嘛),只好加上const:int i;int*& ii = &i;int* const &ii = &i;OK了,const只能放在这里,下面的代码不能编译(为什么?):int i;const int*& ii =

2012-01-05 10:49:33 620

原创 如何把string的元素逆序呢?

论坛里见到这个问题:如何把string的元素逆序?我直接想到的是利用反向迭代器reverse_iterator:rbegin()和rend():string str1("1234567890");string str2(str1.rbegin(), str1.rend());这样的话逆序string就保存在str2里了。要是想保存在原string呢,这样:string str

2012-01-03 11:32:12 12454

原创 cin的错误标记和缓冲区清空

先看下面的代码:vector intVtr;intVtr.insert(intVtr.end(), istream_iterator(cin), istream_iterator());上面的代码就是从标准输入中得到int型数字,并把值插入到intVtr中。当遇到非数字字符时,输入结束。问题是,现在我要继续从标准输入读进int数字并插入intVtr结尾(也可以在其他位置,本文假定

2011-12-31 11:03:14 2468 1

原创 IOCP编程注意事项

虽说我的昵称是EasyIOCP,但是用好IOCP还是不容易的,有很多要注意的地方,长话短说(不涉及细节):       1、每个连接同时最好只有一个待决的WSARecv。IOCP不保证多个待决WSARecv情况下先投递的WSARecv就一定会先得到完成通知。因此,多个待决WSARecv可能导致数据乱序,无谓增加代码复杂性。       2、投递0长度缓冲区的WSARecv可以不

2011-04-26 16:16:00 7344 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除