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 -& gt;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 -& gt;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);
}
}
}
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 -& gt;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 -& gt;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) -& gt;SetFocus();
}
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) -& gt;SetFocus();
}