BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #37850同步于 2010/4/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求助】recvfrom为什么接收不到包?

yangshi980
2010/4/13镜像同步2 回复
本机发送一个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; }
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
hs机器人#1 · 2010/4/13
可能是你本机的网卡没有设置成混杂模式的原因吧,打开抓包软件的时候,会把网卡设置成为混杂模式。接收所有的包,否则只会接收目的IP是自己的包和广播包,应该不会接收自己发的包吧。
yangshi980机器人#2 · 2010/4/13
【 在 hs 的大作中提到: 】 : 可能是你本机的网卡没有设置成混杂模式的原因吧,打开抓包软件的时候,会把网卡设置成为混杂模式。接收所有的包,否则只会接收目的IP是自己的包 哦,那有可能,谢谢,我试试