一个UDP实现广播的小例子

UDP 是USER DATAGRAM PROTOCAL 的简称,是一种在网络上提供的无连接的传输协议。
用UDP通信有以 下特点:
1、 数据传输不用建立连接,所以不可靠;
2、 数据的发送是面向整个网络的,任何一台在局域网内的计算机都可以接收到相同的数据;
参考其他地方,弄一个简单的例子,希望起到抛砖引玉的作用,同时希望能给初次接触UDP之BROADCAST编程的童鞋一些参考。

//recv端
struct SendData
{
ULONG DataSize;
char DataData[1024];
};
BOOL CUdpServerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//省略....

// TODO: Add extra initialization here
if (!InitSocket())
{
return FALSE;
}
CWinThread
* pRecvDataThraead=AfxBeginThread(RecvDataThread,(LPVOID)this);
pRecvDataThraead
->ResumeThread();
return TRUE; // return TRUE unless you set the focus to a control
}
bool CUdpServerDlg::InitSocket()
{
m_socket
=socket(AF_INET,SOCK_DGRAM,0);
if (INVALID_SOCKET==m_socket)
{
MessageBox(
"套接字创建失败!");
return false;
}
SOCKADDR_IN addrBind;
addrBind.sin_addr.S_un.S_addr
=INADDR_ANY;
addrBind.sin_family
=AF_INET;
addrBind.sin_port
=htons(6000);
if (SOCKET_ERROR==bind(m_socket,(LPSOCKADDR)&addrBind,sizeof(SOCKADDR)))
{
MessageBox(
"套接字绑定失败!");
return false;
}
return true;
}
UINT RecvDataThread(LPVOID pThis)
{
CUdpServerDlg
* This=(CUdpServerDlg*)pThis;
This
->RecvData();
return 0;
}
void CUdpServerDlg::RecvData()
{
SOCKADDR_IN addrRecv;
SendData RecvBuf;
int len=sizeof(SOCKADDR_IN);
int recvLen=0;
int BufLen=sizeof(SendData);
while (true)
{
memset(
&RecvBuf,0,sizeof(SendData));
recvLen
=recvfrom(m_socket,(char *)&RecvBuf,BufLen,0,(LPSOCKADDR)&addrRecv,&len);
if (recvLen==SOCKET_ERROR)
{
MessageBox(
"数据接收出错!");
return;
}
else if (0==recvLen)
{
return;
}
else
{
if (RecvBuf.DataSize!=(recvLen-sizeof(ULONG)))
{
MessageBox(
"接受数据出错!");
return;
}
CString strRecv;
GetDlgItemText(IDC_EDIT_RECV,strRecv);
strRecv
+=RecvBuf.DataData;
strRecv
+="\r\n";
SetDlgItemText(IDC_EDIT_RECV,strRecv);
}
}
}

//send端
void CClientDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_EDIT_SEND,str);
if (str!="")
{ SendData SendBuf;
memset(
&SendBuf,0,sizeof(SendData));
strcpy(SendBuf.DataData,str);
SendBuf.DataSize
=strlen(SendBuf.DataData);
sendto(m_sock,(
char*)&SendBuf,sizeof(SendBuf.DataData)+
sizeof(SendBuf.DataSize),0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
CString strHistory;
GetDlgItemText(IDC_EDIT_HISTORY,strHistory);
strHistory
=strHistory+str+"\r\n";
SetDlgItemText(IDC_EDIT_HISTORY,strHistory);
SetDlgItemText(IDC_EDIT_SEND,
"");
GetDlgItem(IDC_EDIT_SEND)
->SetFocus();
}

posted @ 2011-07-07 20:47  likebeta  阅读(879)  评论(0编辑  收藏  举报