CAsyncSocket Problem in Win7



  • Hi ich hab ein Problem mit CAsyncSocke unter Windows 7.
    Ich hab eine Klasse die von CAsyncSocket erbt und für jede Netzwerkkarte auf meinem PC erstell ich eine Instanz meiner Klasse:

    CBootP::CBootP(CList<MAC_IF> *macs, IP_ADAPTER_INFO* inf, CRITICAL_SECTION *cs)
    {
        this->m_cs=cs;
        this->macs=macs;
    	this->inf=inf;
    	this->reqPacket=getReqPacket();  
    	if(!Create(67,SOCK_DGRAM,FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, inf->IpAddressList.IpAddress.String))
    		return;
    	Listen();
    }
    

    anschließend sende ich paar mal ein request

    void CBootP::request()
    {
        CAsyncSocket *sendsock = new CAsyncSocket();
    	//sendsock->SetSockOpt(SO_BROADCAST, &optval, sizeof(optval));
    	sendsock->Create(68, SOCK_DGRAM);
    	sendsock->Connect("255.255.255.255", 68);
    	sendsock->Send(&this->reqPacket,sizeof(this->reqPacket));
    	sendsock->Close();
    	delete sendsock;
    }
    

    und warte auf

    void CBootP::OnReceive(int nErrorCode)
    {
    
    }
    

    Das Problem ist das OnRecive nur auf einer Netzwerkkarte aufgerufen wird. Hab mein Programm auf Windows XP gedebuggt und da hats geklappt. Weiß jemand woran das liegen könnte?



  • na irgendwie verstehe ich oder du was nicht, du willst doch eine verbindung per UTP aufbaun. Also erstellst du dein Socket mit Create und rufst dann Connect auf, das Listen in deinem CBootP Constructor hat das gar nix zu suchen. Wobei deine ganze gestaltung etwas sehr wirr aussieht, oder mag es nur an den zusammengestückelten Ausschnitten liegen. Warum du bei request() ein neues CAsyncSocket() erstellst und dann auch noch auf einen anderen Port sendest, sieht auch etwas komisch aus.

    Zu deinem Problem warum der nur von einer Netzwerkkarte im Receive auslösst kann ich so jetzt auch nix sagen weil ich da keine möglichkeit habe weil die rechner immer nur eine Karte eingebaut haben, warum auch mehrere einbaun.



  • weil broadcasts an alle geräte gesendet werden und ich das netzwerk nich zu spammen will und zu den zwei ports
    das eine is für BootP anfrage das andere für antwort



  • Nur als Hinweis... so wie du dein Socket benutzt, ist es nicht nötig das Objekt auf dem Heap mit new anzulegen.

    Simon



  • bleibt immer noch die Frage warum du im construktor Listen() aufrufst. da wird sicher dein Socket hängen und nicht wieder kehren, denk ich jetzt mal.

    Mes weitern warum du in request() ein neues object auf dem heap erzeugst obwohl du doch einfach SendTo() nutzen könntest.

    Was hat der Broadcast mit dem zuspammen des Netzwerkes zu tun, das machst du doch in dem Fall so und so schon wenn du an alle Nachrichten sendest. Wobei ich eh nicht für UTP bin da man dann doch wieder ein Protokoll drüber stülpen muß und andere Sachen beachten muß, kann man auch gleich auf TCP zurückgreifen. Wenns dann um Verbindung zu mehreren Clienten geht, mußt du halt nur den Server entsprechend aufbaun.



  • sagen wirs so ich habe geräte im netzwerk die auf bootp antworten mit besimmten informationen.

    da ich die ip adresse von den geräten nicht immer wissen kann schick ich an alle geräte eine nachricht und bekomme von denen infos fertig mehr will ich nich machen. und je nach anzahl von netzwerkkarten habe ich hal auch mehrere CbootP instanzen.

    Bei windows xp schaff ichs über beide netzwerkkarten udp zu versenden und bei windows 7 läufts IMMER nur über eine ... bei UDP. HTTP klappt bei mehreren und ich weiß nicht woran das liegt 😕



  • ich weiß jetzt warum das immer nur auf eine netzwerkakrte geschickt wurde

    1. nk
    ip 192.168.2.1/24

    2. nk
    ip 192.168.3.1/24

    im request schickte ich vorher

    sendsock.Connect("255.255.255.255", 68);
    

    richtig is nk1

    sendsock.Connect("192.168.2.255", 68);
    

    und nk2

    sendsock.Connect("192.168.3.255", 68);
    

Anmelden zum Antworten