18,356
社区成员
发帖
与我相关
我的任务
分享
void CUDPDlg::OnBroad()
{
UpdateData(true); //将输入的数据由控件传向控件变量
struct sockaddr_in toaddr; //存放目标地址的结构变量
memset((void *)&toaddr,0,sizeof(addr)); //将toaddr的各字段值全部置0
toaddr.sin_family= AF_INET; //指定协议族为aAF_INET
toaddr.sin_addr.s_addr =INADDR_BROADCAST;//指定发送地址为广播地址
toaddr.sin_port = htons(port-1);
m_List.AddString("I said:" + m_Edit);//将要发送内容添加到ListBox控件
sendto(brdsock,m_Edit,m_Edit.GetLength(),0,(sockaddr*)&toaddr,sizeof(toaddr)); //发送数据到通信对端
}
void CUDPDlg::OnSend()
{
UpdateData(true); //将输入的数据由控件传向控件变量
struct sockaddr_in toaddr; //存放目标地址的结构变量
DWORD bwaddr; //存放目标IP地址的变量
m_IPCtrl.GetAddress(bwaddr); //由IP地址空间变量m_IP获取目标IP地址
memset((void *)&toaddr,0,sizeof(addr)); //将toaddr的各字段值全部置0
toaddr.sin_family= AF_INET; //指定协议族为aAF_INET
toaddr.sin_addr.s_addr =htonl(bwaddr);
toaddr.sin_port = htons(port);
m_List.AddString("本机: >" + m_Edit);//将要发送内容添加到ListBox控件
sendto(sock,m_Edit,m_Edit.GetLength(),0,(sockaddr*)&toaddr,sizeof(toaddr)); //发送数据到通信对端
}
afx_msg LRESULT CUDPDlg::OnRecvmessage(WPARAM wParam, LPARAM lParam)
{
char recvBuffer[1000];
CString str;
int len=sizeof(fromaddr); //recvfrom函数中的最后一个参数,必须赋初值
int size =recvfrom(sock,recvBuffer,sizeof(recvBuffer),0,(sockaddr*)&fromaddr, &len); //接收数据
if(size>0)
{
recvBuffer[size]='\0'; //在字符串末尾添加字符串结束符‘\0’
str.Format("来自%s:%d的消息:%s", inet_ntoa (fromaddr.sin_addr),ntohs(fromaddr.sin_port),recvBuffer);
m_List.AddString(str); //添加到ListBox控件
}
return 0;
}
void CUDPDlg::OnCreate()
{
if ((sock = socket(AF_INET, SOCK_DGRAM,0))<0)
{
MessageBox("创建套接字失败!");
//return true;
}
if ((brdsock = socket(AF_INET, SOCK_DGRAM,0))<0)
{
MessageBox("创建套接字失败!");
//return true;
}
//给数据报套接字绑定地址,以便接收广播信息
memset((void *)&addr,0,sizeof(addr)); //将addr的各字段值全部置0
addr.sin_family =AF_INET; //指定协议族为AF_INET
addr.sin_port = htons(port); //指定UDP端口号
addr.sin_addr.s_addr = htonl(INADDR_ANY); //指定IP地址
while(bind(sock,(LPSOCKADDR)&addr,sizeof(addr))!=0)
{
port++;
addr.sin_port = htons(port); //指定UDP端口号
// MessageBox("绑定失败!");
//closesocket(sock);
// return true;
}
//设置数据报套接字m_DGramSocket的广播属性,使之能发送广播信息
BOOL yes=TRUE;
int ret=setsockopt(brdsock,SOL_SOCKET,SO_BROADCAST,(char*)&yes, sizeof(BOOL));
/***为m_DGramSocket注册FD_READ事件,事件发生时将发送WM_RECVMESSAGE消息***/
if(WSAAsyncSelect(sock, m_hWnd,WM_RECVMESSAGE,FD_READ)!=0)
{
MessageBox("套接字异步事件注册失败!");
closesocket(sock);
}
}
class CUDPDlg : public CDialog
{
// Construction
public:
CUDPDlg(CWnd* pParent = NULL); // standard constructor
SOCKET sock,brdsock;
struct sockaddr_in addr,fromaddr;
// Dialog Data
//{{AFX_DATA(CUDPDlg)
enum { IDD = IDD_UDP_DIALOG };
CListBox m_List;
CIPAddressCtrl m_IPCtrl;
CString m_Edit;
CString m_Port;
//}}AFX_DATA