第二人生的源码分析 三十 UDP接收数据和Windows网络关闭

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               
从上面的协议就知道,有发送数据,就肯定有接收数据;有初始化,就肯定有结束。跟人的生命是一样的,有始就有终。那么第二人生里是怎么样接收数据呢?又是怎么样关闭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。
 
通过上面简单的代码就可以接收到数据,并且是异步的方式接收数据。如果采用同步的方式来接收数据,就需要注意的是调用这个函数并不会立即返回,直到接收到数据才返回来。
 
            

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值