CSocket 实现 UDP



      UDP通信通常被称为无连接通信,这是因为它不需要建立连接,发送端向网络抛送带有地址信息的数据包,数据包在网络中经过一定的路由规则到达接收段,被接收端接收。UDP也可以用来实现网络组播和广播。
     在MFC中, 类CAsyncSocket对winsock中的函数进行了最简单的封装,但使得建立UDP通信的过程变得更为直观和方便。 CAsyncSocket类的主要函数如下:
     BOOL CAsyncSocket::Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL );
用于创建一个本地套接口,其中nSocketPort为使用的端口号,为零则表示由系统自动选择,通常在客户端都使用这个选择。nSocketType为使用的协议族,SOCK_STREAM表明使用有连接的服务,SOCK_DGRAM表明使用无连接的数据报服务。lpszSocketAddress为本地的IP地址,可以使用点分法表示如10.1.1.3。
eg:Create(myPort,SOCK_DGRAM,NULL)
    BOOL CAsyncSocket::Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL )
作为等待连接方时产生一个网络半关联,或者是使用UDP协议时产生一个网络半关联。
eg:Bind(myPort,myAddr)
    void CAsyncSocket::Close( );
关闭套接口。
     int CAsyncSocket::SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )
    int CAsyncSocket::ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );
对于无连接通信发送和接收数据,需要指明对方的IP地址和端口号,nFlags为标记位,双方需要指明相同的标记。
 eg:iSend=m_sockSend.SendTo(buff,BLOCKLENGTH,5801,m_Addr,0)
其返回值表示成功发送或接收的字节数,若返回值<0,可以用GetLastErr()察看错误种类。
     利用这几个函数就可以方便的利用网络发送和接收UDP包了。在有选项 IEventFD_READ时,如果有数据到来,程序自动调用OnReceive(int nErrorCode),所以也可以通过重载OnReceive(),在其中使用ReceiveFrom()来接收数据,并添加一些用户定义的对数据的操作。
     CSocket类是对CAsyncSocket类的继承,与后者的使用方法类似,比较大的不同在于CSocket是同步执行的,即如果前面的操作没有完成的话,后面的操作不会进行下去,所以它有自己的堵塞策略和处理函数,而CAsyncSocket是异步执行的,每调用一次接受或发送函数都会执行一次,而不关心前面的数据是否已经到达。

你可能感兴趣的:(职场,UDP,休闲,CSocket)