本文配套源碼
我們知道TCP/IP協議是至今發展最為成功的協議之一,也是整個互聯網的基礎。它在傳輸層有兩個不同的協議:TCP和UDP,用途都很廣泛,下面我就UDP做一個示例程序。整個例子有兩個程序組成,一個發 送數據,另一個程序接收數據後,完成繪圖工作。
本文程序運行效果圖如下:
一、發送程序
首先建立數據發送程序(Fason)。一共發送四個數據:圓心的X坐標、圓心的Y坐標、圓半徑R、圓的 顏色。它的實現主要如下:
void CFasonDlg::OnSend()
{
UpdateData(TRUE);
CString m_Getstring;
this->m_Cob.GetLBText(m_Cob.GetCurSel(),m_Getstring);
if(m_Getstring==_T("Red"))
yuan1.color=1;
if(m_Getstring==_T("Green"))
yuan1.color=2;
if(m_Getstring==_T("Blue"))
yuan1.color=3;
yuan1.x=m_x;
yuan1.y=m_y;
yuan1.r=m_r;
p=&yuan1;
CDSocket m_hSocket;
m_hSocket.Create(2330,SOCK_DGRAM);
m_hSocket.SendTo( p,sizeof(yuan1),3550,"127.0.0.1");//用結構體發送。
m_x=0;
m_y=0;
m_r=0;
m_hSocket.Close();
UpdateData(FALSE);
}
發送數據時有一個技巧,就是所有數據放在一個結構體中來發送,不用一個一個發送。但是不 能在結構體中包含CString等可以變長的數據類型。
二、接收程序
下面我們看一下接收數據端的程序(Jieshou)。如下:
void CDASocket::OnReceive(int nErrorCode)
{
char buff[256];
int ret=0;
ret=Receive(buff,256);
if(ret==ERROR)
{
TRACE("ERROR!");
}
else
m_pDoc->Presscessding(buff);
class CAsyncSocket::OnReceive(nErrorCode);
}
三、數據處理與顯示
我們設計程序時,數據通常在文檔中處理,顯示工作在視圖中完成。當整個程序較小時,這感覺不到 有何好處,但整個程序較大時,程序的條理就會較清晰,易讀性好。所以一定要時時養成良好的設計習 慣。數據在文檔中處理如下:
void CJieshouDoc::Presscessding(char* lbuff)
{
buff=(struct yuan*)lbuff;
p.x=buff->x;
p.y=buff->y;
p.r=buff->r;
p.color=buff->color;
UpdateAllViews(NULL);
}
在視圖中的顯示如下:
void CJieshouView::OnDraw(CDC* pDC)
{
CJieshouDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
x=pDoc->p.x;
y=pDoc->p.y;
r=pDoc->p.r;
if(pDoc->p.color==1)
pDC->SelectObject(new CBrush(RGB(255,0,0)));
if(pDoc->p.color==2)
pDC->SelectObject(new CBrush(RGB(0,255,0)));
if(pDoc->p.color==3)
pDC->SelectObject(new CBrush(RGB(0,0,255)));
pDC->Ellipse(x-r,y-r,x+r,y+r);
}