俄罗斯贵宾会 > 操作系统 > UDP广播程序可以将信息发送给一台主机上不同端口的客户端吗俄罗斯贵宾会
UDP广播程序可以将信息发送给一台主机上不同端口的客户端吗俄罗斯贵宾会

本身有二个P2P版的UDP广播程序,能够将消息发送给局域网中其余运转该程序的主机,但本身想在本机上测量检验,将消息发送给该主机上几个例外的别本,能够完结吗,附代码如下:

voidCUDPDlg::OnBroad(){UpdateData(true);//将输入的数据由控件传向控件变量structsockaddr_intoaddr;//存放目标地址的结构变量memset((void*)toaddr,0,sizeof(addr));//将toaddr的各字段值全部置0toaddr.sin_family=AF_INET;//指定协议族为aAF_INETtoaddr.sin_addr.s_addr=INADDR_BROADCAST;//指定发送地址为广播地址toaddr.sin_port=htons(port-1);m_List.AddString("Isaid:"+m_Edit);//将要发送内容添加到ListBox控件sendto(brdsock,m_Edit,m_Edit.GetLength(),0,(sockaddr*)toaddr,sizeof(toaddr));//发送数据到通信对端}voidCUDPDlg::OnSend(){UpdateData(true);//将输入的数据由控件传向控件变量structsockaddr_intoaddr;//存放目标地址的结构变量DWORDbwaddr;//存放目标IP地址的变量m_IPCtrl.GetAddress(bwaddr);//由IP地址空间变量m_IP获取目标IP地址memset((void*)toaddr,0,sizeof(addr));//将toaddr的各字段值全部置0toaddr.sin_family=AF_INET;//指定协议族为aAF_INETtoaddr.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_msgLRESULTCUDPDlg::OnRecvmessage(WPARAMwParam,LPARAMlParam){charrecvBuffer[1000];CStringstr;intlen=sizeof(fromaddr);//recvfrom函数中的最后一个参数,必须赋初值intsize=recvfrom(sock,recvBuffer,sizeof(recvBuffer),0,(sockaddr*)fromaddr,len);//接收数据if(size0){recvBuffer[size]='';//在字符串末尾添加字符串结束符‘’str.Format("来自%s:%d的消息:%s",inet_ntoa(fromaddr.sin_addr),ntohs(fromaddr.sin_port),recvBuffer);m_List.AddString(str);//添加到ListBox控件}return0;}voidCUDPDlg::OnCreate(){if((sock=socket(AF_INET,SOCK_DGRAM,0))0){MessageBox("创建套接字失败!");//returntrue;}if((brdsock=socket(AF_INET,SOCK_DGRAM,0))0){MessageBox("创建套接字失败!");//returntrue;}//给数据报套接字绑定地址,以便接收广播信息memset((void*)addr,0,sizeof(addr));//将addr的各字段值全部置0addr.sin_family=AF_INET;//指定协议族为AF_INETaddr.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);//returntrue;}//设置数据报套接字m_DGramSocket的广播属性,使之能发送广播信息BOOLyes=TRUE;intret=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);}}

classCUDPDlg:publicCDialog{//Constructionpublic:CUDPDlg(CWnd*pParent=NULL);//standardconstructorSOCKETsock,brdsock;structsockaddr_inaddr,fromaddr;//DialogData//{{AFX_DATA(CUDPDlg)enum{IDD=IDD_UDP_DIALOG};CListBoxm_List;CIPAddressCtrlm_IPCtrl;CStringm_Edit;CStringm_Port;//}}AFX_DATA
上一篇:2014.11.24 下一篇:下面是代码
返回列表