没有使用CSocket类,我的做法是:在定时器事件中接收数据,OnTimer():
SOCKET s;
sockaddr_in from,a;
WSADATA wsdata;
BOOL optval;
//启动SOCKET库,版本为2.0
WSAStartup(0x0202,&wsdata);
optval=TRUE;
//然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(m_recv_port);
from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(m_recv_port);//接受端口
int fromlength=sizeof(SOCKADDR);
//用UDP初始化套接字
s=socket(AF_INET,SOCK_DGRAM,0);
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
char buf[256];
//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
m_receive_message=buf;
ZeroMemory(buf,256);
UpdateData(false);
注:m_receive_message为显示消息的文本框,经测试,发送数据包是对的,但根本就收不到数据包,为什么呢?
2004年1月1日18:00前结贴
SOCKET s;
sockaddr_in from,a;
WSADATA wsdata;
BOOL optval;
//启动SOCKET库,版本为2.0
WSAStartup(0x0202,&wsdata);
optval=TRUE;
//然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(m_recv_port);
from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(m_recv_port);//接受端口
int fromlength=sizeof(SOCKADDR);
//用UDP初始化套接字
s=socket(AF_INET,SOCK_DGRAM,0);
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
char buf[256];
//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
m_receive_message=buf;
ZeroMemory(buf,256);
UpdateData(false);
注:m_receive_message为显示消息的文本框,经测试,发送数据包是对的,但根本就收不到数据包,为什么呢?
2004年1月1日18:00前结贴
解决方案 »
- 在MFC类中,获得主窗口句柄?
- 想写个类重新绘制cedit边框
- release中出现如下编译提示.但在 debug中正常.请问该如何改?新手再次谢过
- 请教高手,不算太难的问题
- 我想在对话框中得到ComboBox的指针。
- 怎样有效管理内存,不至于程序运行时占用内存越多?大家给点建议!
- 请问OLE DB的问题,为什么只能读不能添加和删除!
- 在windows下用STL技术写出的程序能否无须改动的在LINUX下正常运行?
- 一台PC怎么写个Servic/client程序,能写吗?我就一台机器!
- 求赐此书的随书CD内容。《VISUAL C++从入门到精通》[美]Michael J.Young
- VC中的函数有传值和传参吗???????????????????????
- 一个关于OUTLOOK的问题,救命啊~~
不知你是否是在同一个线程里发送的数据包,如果是的话,检查是
否在OnTimer()触发前还没有发送第一个广播包,如果是的应该是由于没有给
recvfrom设置超时返回导致程序执行到
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
锁住了。
使用setsockopt设置超时即可解决问题。其次代码中还有两处欠妥的地方:
1.
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));这是没有必要的,因为接下来的代码是将该socket绑定到了一个广播地址。2.
from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(m_recv_port);//接受端口//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
这里from参数实质上是个输出参数,而在代码中对其进行初始化也是没有意义的。
socket(...)//建立广播信息
setsockopt(...)//设置成广播socket
sendto(...)//发送到n端口。
客户端:
socket(....)//建立UDP socket
bind(....) 绑定到n端口;
recvfrom(....) 里面那个地址指针是系统填充的,调用完后会被系统填充成广播的出处的地址
recvfrom 里面那个地址指针不是要你传入什么东西,而是系统传会给你的输出参数来的。接受socket必须要bind才能接受信息。