我有一個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
uj5u.com熱心網友回復:
這個不是很容易測驗,下個udo 工具就可以試啦uj5u.com熱心網友回復:
我是問WinSock 的UDP編程可不可以將訊息發送給該主機上幾個不同的副本程式(每個副本都系結不同的埠),程式代碼如何撰寫。uj5u.com熱心網友回復:
UDP廣播編程可不可以將訊息發送給該主機上幾個不同的副本程式啊轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/50122.html
標籤:網絡編程
