程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 運用WinSock進行無連接地通信

運用WinSock進行無連接地通信

編輯:C#基礎知識
程序運行效果截圖:


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);
...
}
/*
接收方采用同步讀取數據的方式,所以沒有讀到數據函數調用將不會返回
*/


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved