利用WinSock进行无连接的通信

来源:互联网 发布:数据挖掘实用案例分析 编辑:程序博客网 时间:2024/05/22 05:24

WinSock提供了对UDP(用户数据报协议)的支持,通过UDP协议我们可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送很简单,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用
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 )
接收数据。函数调用顺序如图

 

 

 

利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。下面是相关代码:

 

 

 

/*

 

 

 

发送方在端口6800上向接收方端口6801发送数据

 

 

 

*/

 

 

 

//发送方代码:

 

 

 

BOOL CMy62_s1_clientDlg::OnInitDialog()

 

 

 

{

 

 

 

        CDialog::OnInitDialog();

 

 

 

 

 

 

        //创建本地套接口

 

 

 

        m_sockSend.Create(6800,SOCK_DGRAM,NULL);

 

 

 

        //绑定本地套接口

 

 

 

        m_sockSend.Bind(6800,"127.0.0.1");

 

 

 

        //创建一个定时器定时发送

 

 

 

        SetTimer(1,3000,NULL);

 

 

 

...

 

 

 

}

 

 

 

void CMy62_s1_clientDlg::OnTimer(UINT nIDEvent)

 

 

 

{

 

 

 

        static iIndex=0;

 

 

 

        char szSend[20];

 

 

 

        sprintf(szSend,"%010d",iIndex++);

 

 

 

        //发送UDP数据

 

 

 

        int iSend= m_sockSend.SendTo(szSend,10,6801,"127.0.0.1",0);

 

 

 

        TRACE("sent %d byte/n",iSend);

 

 

 

...

 

 

 

}

 

 

 

 

 

 

//接收方代码

 

 

 

BOOL CMy62_s1_serverDlg::OnInitDialog()

 

 

 

{

 

 

 

        CDialog::OnInitDialog();

 

 

 

 

 

 

        //创建本地套接口

 

 

 

        m_sockRecv.Create(6801,SOCK_DGRAM,"127.0.0.1");

 

 

 

        //绑定本地套接口

 

 

 

        m_sockRecv.Bind(6801,"127.0.0.1");

 

 

 

        //创建一个定时器定时读取

 

 

 

        SetTimer(1,3000,NULL);

 

 

 

...

 

 

 

}

 

 

 

void CMy62_s1_serverDlg::OnTimer(UINT nIDEvent)

 

 

 

{

 

 

 

        char szRecv[20];

 

 

 

        CString szIP("127.0.0.1");

 

 

 

        UINT uPort=6800;

 

 

 

        //接收UDP数据

 

 

 

        int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);

 

 

 

        TRACE("received %d byte/n",iRecv);

 

 

 

...

 

 

 

}

 

 

 

/*

 

 

 

接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回

 

 

 

*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击