永发信息网

如何利用CAsyncSocket类实现UDP通信

答案:2  悬赏:70  手机版
解决时间 2021-04-12 09:06
  • 提问者网友:浪荡绅士
  • 2021-04-11 21:13
如何利用CAsyncSocket类实现UDP通信
最佳答案
  • 五星知识达人网友:夜余生
  • 2021-04-11 21:28
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包了。在有选项IEvent为FD_READ时,如果有数据到来,程序自动调用OnReceive(int nErrorCode),所以也可以通过重载OnReceive(),在其中使用ReceiveFrom()来接收数据,并添加一些用户定义的对数据的操作。
CSocket类是对CAsyncSocket类的继承,与后者的使用方法类似,比较大的不同在于CSocket是同步执行的,即如果前面的操作没有完成的话,后面的操作不会进行下去,所以它有自己的堵塞策略和处理函数,而CAsyncSocket是异步执行的,每调用一次接受或发送函数都会执行一次,而不关心前面的数据是否已经到达。
全部回答
  • 1楼网友:几近狂妄
  • 2021-04-11 23:02
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为标记位,双方需要指明相同的标记。 其返回值表示成功发送或接收的字节数,若返回值
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯