怎么设置,本机能收到套接字广播

如何设置,本机能收到套接字广播?
如何设置,本机能收到套接字广播?

------解决方案--------------------
下面程序直接拿来就可以使用的,找两台计算机,按空格键发送!

#include <winsock2.h>
#include <ws2tcpip.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "ws2_32.lib ") //包含必要的库


DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;

WSADATA wsd;
struct sockaddr_in local,
remote,
from;

SOCKET sock,sockM;
TCHAR recvbuf[1000],
sendbuf[1000];
int len = sizeof(struct sockaddr_in),
optval,
ret;
DWORD i=0;
char ch;


DWORD WINAPI ThreadFunc( LPVOID lpParam ) ;


void main()
{
//初始化winsock2并创建套接字
WSAStartup(MAKEWORD(2,2),&wsd) ;
sock =WSASocket(AF_INET, SOCK_DGRAM,0,NULL,0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED);


//绑定本地地址
local.sin_family = AF_INET;
local.sin_port = htons(25000);
local.sin_addr.s_addr = INADDR_ANY; //或者:inet_addr( "192.168.0.100 ");
bind(sock,(struct sockaddr *)&local,sizeof(local));


//设置一个广播组
remote.sin_family = AF_INET;
remote.sin_port = htons(25000);
remote.sin_addr.s_addr =inet_addr( "234.5.6.7 ");


//设置TTL
optval = 8;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(char *)&optval,sizeof(int));


//关闭LOOPBACK,否则发送时自己也能收到
optval = 0;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char *)&optval,sizeof(int));


//将创建的套接字加入到广播组
sockM = WSAJoinLeaf(sock,(SOCKADDR *)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH);


//创建起一个线程,阻塞用来接收数据
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function
&dwThrdParam, // argument to thread function
0, // use default creation flags 如果该参数为0,线程就会立即开始执行
&dwThreadId); // returns the thread identifier


//进入主线程
printf( "Press space key to send,press ESC or 'q ' to exit!\n ");
while(1)
{
if(kbhit())
{
ch = getch();

//按‘q’键或ESC退出
if(ch == 'q ' || ch == 27) break;


//按空格键发送
if(ch == ' ')
{
sprintf(sendbuf, "helloworld:%d\n ",i++);
printf( "string:%d send:\t%s\n ",i,sendbuf);
sendto(sock,(char *)sendbuf,20,0,(struct sockaddr *)&remote,sizeof(remote));
}
}
}

closesocket(sock);
WSACleanup();
}


//线程函数
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
while(1)
{
ret = recvfrom(sock,recvbuf,20,0,(struct sockaddr *)&from,&len);


printf( "%s from %s\n ",recvbuf,inet_ntoa(from.sin_addr));
}
}


------解决方案--------------------
??
接收广播不用特别设置吧
让发送方往某个广播地址发送数据就可以了吧
比如接受方的IP 192。168。0。2
发送方往192。168。0。255发送就可以了吧
------解决方案--------------------
同上
但是如果想接收所有的包,如果是共享网络的话可以把网卡设置成混杂模式
------解决方案--------------------
应该得知道发送方的发送端口,比如发送是255.255.255.255:4567。那么将本地SOCKET绑定到4567端口,调用recvfrom函数就可以收到了。