我在网上下了个UDP广播发送的程序(见后),但是我想通过CAsyncSocket实现接受发出的信息。
不知如何实现???网上也找了些文档,但是按着做了后却接收不到任何信息不知哪里有问题?忘各位教我。
1、首先创建了MFC的DLG程序,并创建了个从CAsyncSocket继承的新类CDASocket,重载了OnReceive函数,使用receive进行接收。
char buff[256];
strcpy(buff,"");
Receive(buff,sizeof(buff),0); 
CString tmpstr="";
tmpstr=(CString)buff;
2、添加public变量CDASocket mtestsocket;然后在Dlg的OnInitDialog中
mtestsocket.Create(5050,SOCK_DGRAM); 
mtestsocket.SetSockOpt(SO_BROADCAST,&b,sizeof(BOOL),SOL_SOCKET); 
mtestsocket.SetSockOpt(SO_DONTROUTE,&b,sizeof(BOOL),SOL_SOCKET); 
mtestsocket.SetSockOpt(SO_RCVBUF,&eee,sizeof(int),SOL_SOCKET); 
mtestsocket.AsyncSelect(FD_READ); 
这里最后一句就执行不了,出错了,隐掉后可程序启动;但是由于没有FD_READ故OnReceive不执行(这里不知我理解的对不对)
3、我又添加了个按钮,测试一下手工看能不能接收数据。
char buff[256];
strcpy(buff,""); mtestsocket.Receive(buff,sizeof(buff),0); 
CString tmpstr="";

tmpstr=(CString)buff;
也接受不到任何数据
4、又测试了mtestsocket.ReceiveFrom(pbuf,bl,name,nport,0);也不成。忘各位高手教我应该如何做呢?
UDP广播发送:
*****************************
#include<stdlib.h>
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>#pragma comment(lib,"ws2_32.lib")
main()
{
SOCKET s;
sockaddr_in addrto;
WSADATA wsdata;
BOOL bsocket;
char *smsg="this is a test";
//&AElig;&ocirc;&para;&macr;SOCKET&iquest;&acirc;&pound;&not;°&aelig;±&frac34;&Icirc;&ordf;2.0
WSAStartup(0x0202,&wsdata);

s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
bsocket=TRUE;
    //&Egrave;&raquo;&ordm;ó&cedil;&sup3;&Ouml;&micro;&cedil;&oslash;&micro;&Oslash;&Ouml;·&pound;&not;&Oacute;&Atilde;&Agrave;&acute;&acute;&Oacute;&Iacute;&oslash;&Acirc;&ccedil;&Eacute;&Iuml;&micro;&Auml;&sup1;&atilde;&sup2;&yen;&micro;&Oslash;&Ouml;·&frac12;&Oacute;&Ecirc;&Otilde;&Iuml;&ucirc;&Iuml;&cent;&pound;&raquo;
addrto.sin_family=AF_INET;
    addrto.sin_addr.s_addr=INADDR_BROADCAST;
addrto.sin_port=htons(5050);
bool opt=true;
//&Eacute;è&Ouml;&Atilde;&cedil;&Atilde;&Igrave;×&frac12;&Oacute;×&Ouml;&Icirc;&ordf;&sup1;&atilde;&sup2;&yen;&Agrave;à&ETH;&Iacute;&pound;&not;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt));
int nlen=sizeof(addrto);
while(1)
{
Sleep(1000);
//&acute;&Oacute;&sup1;&atilde;&sup2;&yen;&micro;&Oslash;&Ouml;··&cent;&Euml;&Iacute;&Iuml;&ucirc;&Iuml;&cent;
int ret=sendto(s,smsg,256,0,(sockaddr*)&addrto,nlen);
if(ret==SOCKET_ERROR)
cout<<WSAGetLastError()<<endl;
else
{
printf("ok");
}
}
}

解决方案 »

  1.   

    mtestsocket.Create(5050,SOCK_DGRAM); 
    mtestsocket.SetSockOpt(SO_BROADCAST,&b,sizeof(BOOL),SOL_SOCKET); 
    mtestsocket.SetSockOpt(SO_DONTROUTE,&b,sizeof(BOOL),SOL_SOCKET); 
    mtestsocket.SetSockOpt(SO_RCVBUF,&eee,sizeof(int),SOL_SOCKET); 
    mtestsocket.AsyncSelect(FD_READ); 
    /////////////////////////////////////////////////判断这个过程是否有错误发生,使用WSAGetLastError()看看错误码是什么
      

  2.   

    返回10093错误,我查了一下但是如何解决做呢?我在CAsyncSocket里就看到一个create函数阿************************WSANOTINITIALISED           (10093)             Successful WSAStartup() not yet performed.应用程序没有调用WSAStartup()函数,或函数WSAStartup()调用失败了。应用程序可能访问了不属于当前活动任务的套接字(例如试图在任务间共享套接字),或调用了过多的WSACleanup()函数。
      

  3.   

    我在Create之前添加了如下两行就能接收到数据了,哈。
    另外还有个问题:为什么我没用mtestsocket.AsyncSelect(FD_READ); 也能在OnReceive函数中接收到数据呢?这样的话FD_READ是什么含义呢?一般在哪里用到?
    望各位大大指教
    **************
    WSADATA wsdata;
    WSAStartup(0x0202,&wsdata);