今晚写了一个简单的局域网内同一子网的广播程序,总结起来关键 点主要是:
1。往同一子网内所有机器发送消息的地址为: 255.255.255.255 这是TCP/IP协议关于IP分配中规定的,其他特殊的地址也有不同的意义~具体可以参考RFC 相关文档
2。广播消息只能给予UDP协议,原因是UDP是面向无连接的,不像TCP一样正式通信之前要进行“三次握手”,从而建立端对端(end to end)的连接。
3。设置好SOCKET的工作方式,即设置为广播方式。调用setsockopt(.....)函数实现
以下是实现的代码(最精简的):
1。发送消息方:
#define INADDR_BROADCAST (u_long)0xFFFFFFFF
void CserverDlg::OnBnClickedButton1()
{
WSADATA wsaData;
WORD wVersion=0x0202;
sockaddr_in server_addr,client_addr;
if (WSAStartup(wVersion,&wsaData)!=0)
{
AfxMessageBox("WSAStartup fail!");
return;
}
SOCKET server=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
server_addr.sin_addr.S_un.S_addr=INADDR_ANY;
server_addr.sin_family=AF_INET;
//server_addr.sin_port=htons();
//bind(server,(sockaddr*)&server_addr,sizeof(server_addr));
char buff[255];
CString strText;
GetDlgItem(IDC_EDIT1)->GetWindowText(strText);
strcpy(buff,strText);
AfxMessageBox(buff);
int iLen=sizeof(buff);
client_addr.sin_addr.S_un.S_addr=INADDR_BROADCAST;
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(8000);
BOOL bBroadcast;
//设置广播工作方式,关键
setsockopt(server,SOL_SOCKET,SO_BROADCAST,(char*)&bBroadcast,sizeof(bBroadcast));
sendto(server,buff,iLen,0,(sockaddr*)&client_addr,sizeof(client_addr));
closesocket(server);
WSACleanup();
}
接收消息方:
void CclientDlg::OnBnClickedButton1()
{
WSADATA wsaData;
WORD wVersion=0x0202;
sockaddr_in server_addr,client_addr;
if (WSAStartup(wVersion,&wsaData)!=0)
{
AfxMessageBox("WSAStartup fail!");
return;
}
SOCKET client=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
client_addr.sin_addr.S_un.S_addr=INADDR_ANY;
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(8000);
bind(client,(sockaddr*)&client_addr,sizeof(client_addr));
char buff[255];
int iLen;
iLen=sizeof(server_addr);
while (1)
{
if (recvfrom(client,buff,sizeof(buff),0,(sockaddr*)&server_addr,&iLen)>0)
break;
}
GetDlgItem(IDC_EDIT1)->SetWindowText(buff);
closesocket(client);
WSACleanup();
以上为阻塞式通讯方式,通过直接的API函数实现。若用MFC Windows Socket 类则更加方便实用。程序在宿舍楼局域网运行通过~