一个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
-& 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();
}

转载于:https://www.cnblogs.com/likebeta/archive/2011/07/07/2100446.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值