第二人生的源码分析(三十)UDP接收数据和Windows网络关闭
来源:互联网 发布:淘宝下架排名靠前 编辑:程序博客网 时间:2024/04/29 03:07
从上面的协议就知道,有发送数据,就肯定有接收数据;有初始化,就肯定有结束。跟人的生命是一样的,有始就有终。那么第二人生里是怎么样接收数据呢?又是怎么样关闭Windows网络呢?通过下面的代码就可以学会怎么样使用UDP接收数据,并且关闭网络,回收资源给Windows系统。
下面的代码先判断是否创建了socket,如果创建了,就接着先关闭网络通讯,再接着删除socket句柄。最后调用函数WSACleanup来删除网络资源。
#001 void end_net(S32& socket_out)
#002 {
#003 if (socket_out >= 0)
#004 {
#005 shutdown(socket_out, SD_BOTH);
#006 closesocket(socket_out);
#007 }
#008 WSACleanup();
#009 }
#010
下面是通过异步来接收UDP数据。
#011 S32 receive_packet(int hSocket, char * receiveBuffer)
#012 {
#013 // Receives data asynchronously from the socket set by initNet().
#014 // Returns the number of bytes received into dataReceived, or zero
#015 // if there is no data received.
#016 int nRet;
#017 int addr_size = sizeof(struct sockaddr_in);
#018
#019 nRet = recvfrom(hSocket, receiveBuffer, NET_BUFFER_SIZE, 0, (struct sockaddr*)&stSrcAddr, &addr_size);
#020 if (nRet == SOCKET_ERROR )
#021 {
#022 if (WSAEWOULDBLOCK == WSAGetLastError())
#023 return 0;
#024 if (WSAECONNRESET == WSAGetLastError())
#025 return 0;
#026 llinfos << "receivePacket() failed, Error: " << WSAGetLastError() << llendl;
#027 }
#028
#029 return nRet;
#030 }
第17行代码计算接收IP地址的大小。
第19行代码调用Windows API函数recvfrom来接收数据。如果没有数据到达,就产生WSAEWOULDBLOCK的错误。如果网络复位,就会产生WSAECONNRESET的错误。显然调用这段代码后,还会返回其它的错误码SOCKET_ERROR,这是在调用后再处理的。正常的返回是接收到的数据大小,可以不处理的错误就是返回0。
通过上面简单的代码就可以接收到数据,并且是异步的方式接收数据。如果采用同步的方式来接收数据,就需要注意的是调用这个函数并不会立即返回,直到接收到数据才返回来。
- 第二人生的源码分析(三十)UDP接收数据和Windows网络关闭
- 蔡军生先生第二人生的源码分析(三十)UDP接收数据和Windows网络关闭
- 第二人生的源码分析(二十九)Windows网络初始化
- 第二人生的源码分析(三十一)接收数据的流量控制
- 第二人生的源码分析(四十八)接收服务器回应的纹理图片头数据
- 第二人生的源码分析(四十九)接收服务器回应的纹理图片数据
- 蔡军生先生第二人生的源码分析(三十一)接收数据的流量控制
- 蔡军生先生第二人生的源码分析(三十一)接收数据的流量控制
- 蔡军生先生第二人生的源码分析(四十八)接收服务器回应的纹理图片头数据
- 蔡军生先生第二人生的源码分析(四十九)接收服务器回应的纹理图片数据
- 第二人生的源码分析(二十八)UDP发送数据的可靠性控制
- 蔡军生先生第二人生的源码分析(二十八)UDP发送数据的可靠性控制
- 蔡军生先生第二人生的源码分析(二十九)Windows网络初始化
- muduo源码分析之实现TCP网络库(连接的接收和关闭)
- 第二人生的源码分析(二十六)底层网络协议
- 第二人生的源码分析(2)第二人生的基本功能
- 第二人生的源码分析(2)第二人生的基本功能
- 第二人生的源码分析(三十九)关闭WinXP的错误报告功能
- delphi6调用.NET WEBSERVICE注意事项
- 增加上传文件控件
- 又到三月三
- u-boot启动过程分析——基于lpc2210的移植代码
- 通过理顺软件的依赖关系提高应用程序灵活性
- 第二人生的源码分析(三十)UDP接收数据和Windows网络关闭
- 马太效应
- 利用VMWare构建SoftICE调试环境 - 峥嵘岁月 - CSDNBlog
- PHP中分页的实现
- 7-Javascript积累
- fatal error C1076: compiler limit (转)
- 帝国2
- 盖茨给职场新人的10句话
- Linux下的解压命令(ZZ)