
网络编程
HardIOCP
这个作者很懒,什么都没留下…
展开
-
调用closesocket()背后发生的事
应用层代码想要关闭一个TCP连接可以直接调用closesocket(),但是这个函数的行为并不“单纯”,只有了解closesocket()背后的故事,才能对关闭TCP连接有正确的认识。首先明确一点:任何情况下,调用closesocket之后,socket句柄立即失效(一种情况除外,见下文),再对该socket进行操作的API都会失败。但是socket句柄对应的系统资源不一定立即释放,由内核控制原创 2012-01-12 13:38:29 · 12340 阅读 · 1 评论 -
如何在应用层控制TCP三次握手的过程
1原创 2012-01-12 13:48:12 · 1490 阅读 · 1 评论 -
完成端口GetQueuedCompletionStatus()返回错误,怎样获得真正的错误代码
GetQueuedCompletionStatus()返回错误,说明I/O失败。此时调用GetLastError()得到的往往是ERROR_NETNAME_DELETED(64),WSAGetLastError()也一样,这显然不是真正的错误代码,那么怎么得到真正的错误代码呢?给出下面的代码:int YourIOCPClass::GetSockError(WSAOVERLAPPED* pW原创 2012-01-12 17:01:18 · 5761 阅读 · 2 评论 -
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 · 1552 阅读 · 0 评论 -
IOCP如何既能发送RST复位连接避免TIME_WAIT状态,又能重用socket?
待续原创 2012-01-12 13:49:14 · 2066 阅读 · 0 评论 -
IOCP编程注意事项
虽说我的昵称是EasyIOCP,但是用好IOCP还是不容易的,有很多要注意的地方,长话短说(不涉及细节): 1、每个连接同时最好只有一个待决的WSARecv。IOCP不保证多个待决WSARecv情况下先投递的WSARecv就一定会先得到完成通知。因此,多个待决WSARecv可能导致数据乱序,无谓增加代码复杂性。 2、投递0长度缓冲区的WSARecv可以不原创 2011-04-26 16:16:00 · 7476 阅读 · 3 评论