accept



  • hallo ich komme mit den sockets in visual basic nicht so ganz klar.

    ich habe drei pcs. der erste meldet sich an, das funktioniert dann soweit , dann meldet sich der zweite an. aber wenn ich nach der ip nachschaue kriege ich immer nur die ip des ersten clienten

    [cpp]
    struct sockaddr_in sa;
    int iLen = sizeof(sa);
    UCHAR adresse[4];
    string ip;

    for (int i=0;i<=1;i++){
    clients[i].GetPeerName((SOCKADDR*)&sa, &iLen);

    adresse[0]=sa.sin_addr.S_un.S_un_b.s_b1;
    adresse[1]=sa.sin_addr.S_un.S_un_b.s_b2;
    adresse[2]=sa.sin_addr.S_un.S_un_b.s_b3;
    adresse[3]=sa.sin_addr.S_un.S_un_b.s_b4;

    ip=ListenSocket.toString(adresse[0])+"."+ListenSocket.toString(adresse[1])+"."+ListenSocket.toString(adresse[2])+"."+ListenSocket.toString(adresse[3]);

    ListenSocket.Accept(clients[i]);

    }
    [cpp]

    nachdem sich der erste client angemeldet hat kieg ich immer nur seine ip wenn sich der zweite anmeldet? was mach ich da falsch?
    möchte nämlich vorher wissen ob der zweite schon angemdelt ist oder nicht. wenn ja dann würde ich nämlich nicht mehr accept aufrufen.

    wenn beide sich angemeldet haben kann ich auch beiden clienten eine nachricht schicken indem ich entweder über cliens[0] oder über clients[1] nachrichten verschicke.

    ausserdem noch was, wofür ist bind() eigentlich gut?

    brauch ich das hier?

    viele dank für eure hilfe

    mfg



  • hallo ich komme mit den sockets in visual basic nicht so ganz klar.

    ich habe drei pcs. der erste meldet sich an, das funktioniert dann soweit , dann meldet sich der zweite an. aber wenn ich nach der ip nachschaue kriege ich immer nur die ip des ersten clienten

    struct sockaddr_in sa;
    int iLen = sizeof(sa);
    UCHAR adresse[4];
    string ip;
    
    for (int i=0;i<=1;i++){
    clients[i].GetPeerName((SOCKADDR*)&sa, &iLen);
    
    adresse[0]=sa.sin_addr.S_un.S_un_b.s_b1;
    adresse[1]=sa.sin_addr.S_un.S_un_b.s_b2;
    adresse[2]=sa.sin_addr.S_un.S_un_b.s_b3;
    adresse[3]=sa.sin_addr.S_un.S_un_b.s_b4;
    
    ip=ListenSocket.toString(adresse[0])+"."+ListenSocket.toString(adresse[1])+"."+ListenSocket.toString(adresse[2])+"."+ListenSocket.toString(adresse[3]);
    
    ListenSocket.Accept(clients[i]);
    
    }
    

    nachdem sich der erste client angemeldet hat kieg ich immer nur seine ip wenn sich der zweite anmeldet? was mach ich da falsch?
    möchte nämlich vorher wissen ob der zweite schon angemdelt ist oder nicht. wenn ja dann würde ich nämlich nicht mehr accept aufrufen.

    wenn beide sich angemeldet haben kann ich auch beiden clienten eine nachricht schicken indem ich entweder über cliens[0] oder über clients[1] nachrichten verschicke.

    ausserdem noch was, wofür ist bind() eigentlich gut?

    brauch ich das hier?

    viele dank für eure hilfe

    mfg



  • GetPeerName hat einen Rückgabewert.



  • bin grade nicht zuhause am pc. was ist das denn für ein rückgabewert? ip als string?



  • das ist ja nur ein int, der zeigt ob die verbindung zustande gekommen ist.
    was soll ich denn damit anfangen?



  • sockets schrieb:

    was soll ich denn damit anfangen?

    Prüfen wäre mal ein guter erster Schritt. Eine grundlegende Fehlerbehandlung kann jedenfalls nicht schaden, wenn man das Problem eingrenzen will.



  • gut, und danach? wie kriege ich die richtige ip adresse?



  • sockets schrieb:

    gut, und danach? wie kriege ich die richtige ip adresse?

    GetPeerName gibt bei dir also immer TRUE zurück?



  • nicht ganz, eine 1 aber ich glaube das ist dazu äquivalent 🙂



  • Wo steht denn dieser Code überhaupt?
    Was genau ist ListenSocket?
    Was liefert Accept zurück?



  • in der klasse die von casyncsocket abgeleitet ist steht die onaccept methode

    void client::OnAccept(int nErrorCode)
    
        if (nErrorCode == 0) // Wenn keine Fehler auftreten, die Funktion zum Akzeptieren in der Dialogklasse aufrufen
            ((CNetzwerkClientKaSimDlg*)m_pWnd)->OnAkzeptieren();
    }
    

    diese ruft die methode onakzeptieren in der dialog klasse auf

    void CNetzwerkClientKaSimDlg::OnAkzeptieren()    // Wird aufgerufen, wenn der Server eine Anfrage akzeptiert
    {	
    
    	struct sockaddr_in sa; 
    	int iLen = sizeof(sa);
    	UCHAR adresse[4];
    	string ip;
    	int result;
    
    	int i;
    	for (i=0;i<=30;i++){
    		clients[i].GetPeerName((SOCKADDR*)&sa, &iLen); 
    		adresse[0]=sa.sin_addr.S_un.S_un_b.s_b1;
    		adresse[1]=sa.sin_addr.S_un.S_un_b.s_b2;
    		adresse[2]=sa.sin_addr.S_un.S_un_b.s_b3;
    		adresse[3]=sa.sin_addr.S_un.S_un_b.s_b4;
    		ip=ListenSocket.toString(adresse[0])+"."+ListenSocket.toString(adresse[1])+"."+ListenSocket.toString(adresse[2])+"."+ListenSocket.toString(adresse[3]);
    
    		if(ip=="204.204.204.204"){
    			result=ListenSocket.Accept(clients[i]);
    			break;
    		}
    	}
    
    	for(int j=0;j<=30;j++){
    		if(j==i)
    			j++;
    		if(clients[j].GetPeerName((SOCKADDR*)&sa, &iLen)==clients[i].GetPeerName((SOCKADDR*)&sa, &iLen))
    			clients[j].Close();
    	}
    
    }
    

    ListeSocket ist ein
    [/cpp]
    class client : public CAsyncSocket
    [cpp]

    accept liefert 1 zurück



  • GetPeerName sollte erst dann etwas Sinnvolles liefern können, wenn du diesen Socket erfolgreich an Accept übergeben hast.



  • ja jetzt gehts, danke schön aber

    woher weiss ich jetzt welche ips bereits eingetragen sind?

    ich packe die clienten ja in ein array indem ich accept aufrufe.

    wie kann ich dann auf ein objekt in einem array zugreifen und mir informationen darüber holen?

    ich möchte dass sich ein client anmeldet und wenn der schon angemeldet war dann wieder austragen.

    oder zb. das ganze array durchlaufen und alle angemeldeten clienten bzw akzeptierten clienten ausgeben können.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten