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

kathycxx 2007-03-27 02:46:09
如何设置,本机能收到套接字广播?
...全文
262 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodmilk 2007-04-01
  • 打赏
  • 举报
回复
应该得知道发送方的发送端口,比如发送是255.255.255.255:4567。那么将本地SOCKET绑定到4567端口,调用recvfrom函数就可以收到了。

SOCKET s = ::socket (AF_INET, SOCK_DGRAM, 0);

SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_port = ::ntohs (4567);

::bin (s, (sockaddr *)&sin, sizeof(sin))

SOCKADDR_IN addrRemote;
int nLen = sizeof (addrRemote);
char sz[256];
while (TRUE) {
int nRet = ::recvfrom (s, sz, 256, 0, (sockaddr *)&addrRemote, &nLen);
if (nRet > 0) {
sz[nRet] = '\0';
printf (sz);
}
}
captain_x 2007-03-31
  • 打赏
  • 举报
回复
同上
但是如果想接收所有的包,如果是共享网络的话可以把网卡设置成混杂模式
songzijian 2007-03-27
  • 打赏
  • 举报
回复
??
接收广播不用特别设置吧
让发送方往某个广播地址发送数据就可以了吧
比如接受方的IP 192。168。0。2
发送方往192。168。0。255发送就可以了吧
dijkstar 2007-03-27
  • 打赏
  • 举报
回复
下面程序直接拿来就可以使用的,找两台计算机,按空格键发送!

#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));
}
}

18,356

社区成员

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

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