返回信息流本机发送一个udp广播包,但是在本机接收不到,recvfrom一直阻塞不返回,可是旁边的另外机器可以接收到。但是我本机如果开抓包工具查看网络上的数据包时,程序就能收到广播的包...很奇怪。
#define BUFFER_SIZE 100
//这个是发送广播包的线程:
UINT CSocBCDlg::ThreadUpdateSend(PVOID p)
{
int len;
int erro=0;
len=sizeof(sockaddr);
CSocBCDlg*pDlg=(CSocBCDlg*)p;
int BCListen=socket(AF_INET,SOCK_DGRAM,0);
erro=GetLastError();
sockaddr_in scAdr;
scAdr.sin_family=AF_INET;
scAdr.sin_port=htons(5678);
scAdr.sin_addr.s_addr=inet_addr("255.255.255.255");
memset(&scAdr.sin_zero,0,8);
len=sizeof(char);
char so_broadcast=TRUE;
if(setsockopt(BCListen,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast))==SOCKET_ERROR)
TRACE0("setsockopt失败\n");
len=sizeof(sockaddr);
char c[BUFFER_SIZE];
strcpy(&c[0],(LPCTSTR)pDlg->m_name);//m_name是CString类型变量
do
{
if(sendto(BCListen,c,BUFFER_SIZE,0,(sockaddr*)&scAdr,sizeof(sockaddr))==-1)
{
TRACE0("sendto失败\n");
erro=GetLastError();
}
Sleep(5000);
} while (1);
return 1;
}
//这个是接收广播包的线程
UINT CSocBCDlg::ThreadUpdateReceive(PVOID p)
{
int len;
int erro=0;
sockaddr_in scAdr,scAdrFrom;
CString name;
int BCReceive=socket(AF_INET,SOCK_DGRAM,0);
len=sizeof(sockaddr);
scAdr.sin_family=AF_INET;
scAdr.sin_port=htons(5678);
scAdr.sin_addr.s_addr=INADDR_ANY;//inet_addr("255.255.255.255");
memset(&scAdr.sin_zero,0,8);
if(bind(BCReceive,(sockaddr*)&scAdr,len)==-1)
TRACE0("bind失败\0");
erro=GetLastError();
char buff[BUFFER_SIZE];
do
{
if(recvfrom(BCReceive,buff,BUFFER_SIZE,0,(sockaddr*)&scAdrFrom,&len)==-1)
{
TRACE0("recvfrom 失败\n");
erro=GetLastError();
}
} while (1);
return 1;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #37850同步于 2010/4/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【求助】recvfrom为什么接收不到包?
yangshi980
2010/4/13镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
可能是你本机的网卡没有设置成混杂模式的原因吧,打开抓包软件的时候,会把网卡设置成为混杂模式。接收所有的包,否则只会接收目的IP是自己的包和广播包,应该不会接收自己发的包吧。
【 在 hs 的大作中提到: 】
: 可能是你本机的网卡没有设置成混杂模式的原因吧,打开抓包软件的时候,会把网卡设置成为混杂模式。接收所有的包,否则只会接收目的IP是自己的包
哦,那有可能,谢谢,我试试