我要做一个程序向网络发送udp广播,该怎么做?最好有例子。
解决方案 »
- 如何在DLL中用WINAPI创建一个窗口
- 怎样通过获取进程来控制一个程序的运行?一些外挂的原理
- 我发现给MFC程序加载XP主题会出乱码,哪位高手知道原因?
- 听听大家的意见
- 一个关于莫名其妙的全局窗口句柄(主要是我的水平有限,看不出它有什么用处)
- 初学,,WDM驱动开发,难死了,,郁闷ing,有没有高手指点一下????
- 我在程序里写的注册表字符串后面有省略号(就是三个小点)
- 局域网PC通过交换机拨外网的VPN服务器
- 如何在资源中包含其他资源?
- 在VC中用ActiveMovie播放MPEG1文件时如何得到ActiveMovie控件的通知事件?
- 在VC中控制Excel的列宽
- 把内存中一段读入由char *p指向的一段缓存,想要从中搜索数据,但数据类型不定,该怎样做?
//multicast using CAsyncSocket/////////////////////// fd_set fds;
FD_ZERO(&fds);
FD_SET(m_Socket, &fds);
struct timeval timeout;
timeout.tv_sec = m_Timeout;
timeout.tv_usec = 0;
switch (select(0, NULL, &fds, NULL, &timeout))
{
case SOCKET_ERROR:
return GetLastErrorCode();
case 0:
return ERROR_SOCKET_TIMEOUT;
} SOCKADDR_IN addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(255.255.255.255);
addr.sin_port = htons(9999);
int send_len = sendto(m_Socket, (char *)buffer, len, 0, (struct sockaddr *)&addr, sizeof(SOCKADDR));
if (send_len == SOCKET_ERROR || send_len == 0) return GetLastErrorCode(); //////主 题: 在局域网中, 使用 SOCKET编程,如何广播消息??? ///////////////////////////////////////////////////
//发送端程序
#include <stdio.h >
#include <winsock.h >
int main(int argc, char* argv[]) {
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saUdpServ;
BOOL fBroadcast = TRUE;
char sendBuff[1024];
int nSize;
int ncount=0;
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化
{
printf( "Can't initiates windows socket!Program stop.\n ");//初始化失败返回-1
return -1;
}
sockListener=socket(PF_INET,SOCK_DGRAM,0);
setsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST,
(CHAR *)&fBroadcast,sizeof ( BOOL ));
sin.sin_family = AF_INET;
sin.sin_port = htons(0);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR *)&sin, sizeof(sin))!=0)
{
printf( "Can't bind socket to local port!Program stop.\n ");//初始化失败返回-1
return -1;
}
saUdpServ.sin_family = AF_INET;
saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );
saUdpServ.sin_port = htons (7001);//发送用的端口,可以根据需要更改
nSize = sizeof ( SOCKADDR_IN );
while(1)
{
sprintf(sendBuff, "Message %d ",ncount++);
sendto ( sockListener,sendBuff,
lstrlen (sendBuff),
0,
(SOCKADDR *) &saUdpServ,
sizeof ( SOCKADDR_IN ));
printf( "%s\n ",sendBuff);
}
return 0;
}
///////////////////// //接收
#include <stdio.h >
#include <winsock.h >
#include <conio.h >
int main(int argc, char* argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saClient;
char cRecvBuff[1024];
int nSize,nbSize;
int iAddrLen=sizeof(saClient);
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化
{
printf( "Can't initiates windows socket!Program stop.\n ");//初始化失败返回-1
return -1;
}
sockListener=socket(AF_INET, SOCK_DGRAM,0);
sin.sin_family = AF_INET;
sin.sin_port = htons(7001);//发送端使用的发送端口,可以根据需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
{
printf( "Can't bind socket to local port!Program stop.\n ");//初始化失败返回-1
return -1;
}
while(1)
{
nSize = sizeof ( SOCKADDR_IN );
if((nbSize=recvfrom (sockListener,cRecvBuff,1024,0,
(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR)
{
printf( "Recive Error ");
break;
}
cRecvBuff[nbSize] = '\0';
printf( "%s\n ",cRecvBuff);
}
return 0;
}