没有使用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前结贴

解决方案 »

  1.   

    首先说收不到包的问题:
    不知你是否是在同一个线程里发送的数据包,如果是的话,检查是
    否在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参数实质上是个输出参数,而在代码中对其进行初始化也是没有意义的。
      

  2.   

    http://tasm.51.net/question/NetBrocast.rar这是程序代码,请帮忙调试一下,谢谢
      

  3.   

    思路都错了,接受广播的顺序是:服务端:
    socket(...)//建立广播信息
    setsockopt(...)//设置成广播socket
    sendto(...)//发送到n端口。
    客户端:
    socket(....)//建立UDP socket
    bind(....) 绑定到n端口;
    recvfrom(....) 里面那个地址指针是系统填充的,调用完后会被系统填充成广播的出处的地址
    recvfrom 里面那个地址指针不是要你传入什么东西,而是系统传会给你的输出参数来的。接受socket必须要bind才能接受信息。
      

  4.   

    就是客户端要bind到服务器会把广播发到的n端口,然后recvfrom那里的地址不需要提供什么信息,而是接收系统返回的信息。
      

  5.   

    回复:sboom(+-LingCh-+) :我没有用服务器,就是一个单一的udp局域网聊天程序大家有空帮我调试一下吧,谢谢了http://tasm.51.net/question/NetBrocast.rar2004年第一贴,祝大家新年快乐
      

  6.   

    但你的客户端写错了。没有bind