UDP广播程序可以将信息发送给一台主机上不同端口的客户端吗

wuxia2118 2019-04-08 05:28:24
我有一个P2P版的UDP广播程序,可以将消息发送给局域网中其他运行该程序的主机,但我想在本机上测试,将消息发送给该主机上几个不同的副本(每个副本都绑定不同的端口),可以实现吗,附代码如下:
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
...全文
371 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxia2118 2019-04-22
  • 打赏
  • 举报
回复
UDP广播编程可不可以将消息发送给该主机上几个不同的副本程序啊
wuxia2118 2019-04-17
  • 打赏
  • 举报
回复
我是问WinSock 的UDP编程可不可以将消息发送给该主机上几个不同的副本程序(每个副本都绑定不同的端口),程序代码如何编写。
叶恭介叶恭介 2019-04-13
  • 打赏
  • 举报
回复
这个不是很容易测试,下个udo 工具就可以试啦

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧