Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Casyncsocket Server/client

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.08.2003, 09:59 Uhr
~TOM
Gast


Hallo Leute.

Bin heute hier als Gast, weil ich mein Name und Pass verlegt habe, aber vieleicht kann mir ja einer der admins helfen und es mir wieder zuschicken auf die gleiche E-Mail wie bei der anmeldung ist aber schon ca 5 monate her.

So, mein Problem

Ich versuche grade ein Prog zuschreiben mit dem man "chatten" kann.

Funktioniert auch alles soweit wenn ich einen Server und einen Clienten habe.
Aber sobald ich 2 Clienten habe, habe ich einen Runtimeerror.
Das senden vom Server zu beiden (oder mehren) clienten schaffe ich schon, aber der Server nimmt keine Nachrichten vom 2. Clienten an. Der erste Client der sich angemeldet hat, kann aber mit dem Server ganznormal schreiben.

Der Runtime ist in der OnReceive() Funktion.
Der Fehler heist "Unbehandelte Ausnahme in Sockets1.exe: 0xC0000005: Access Violation"
Soweit ich mitbekommen habe, liegt es daran das ich daten auf einem socket empfangen soll der grade nicht auf "empfang" steht.


C++:
void CSockets1Dlg::OnReceive()
{
char *pBuf = new char[1025];
int iBufSize = 1024;
int iRcvd = 0;
CString strRecvd;

if (m_iType == 1)
{    
    //mein Versuch den richtigen socket rauszubekommen wo die Nachricht hin soll
    double vergleichsocket=0;
    for (int i=0;i<5;i++)
    {

        if ((long)m_sConnectSocket[0].m_hSocket == (long)m_client[i].getclientsocket() )
        {
        m_clientindex = i;
        }
    }
}
// Nachricht empfangen

iRcvd = m_sConnectSocket[m_clientindex].Receive(pBuf, iBufSize);
// Wurde etwas empfangen?
    if (iRcvd == SOCKET_ERROR)
    {

    }
    else
    {
        // Ende der Nachricht abschneiden
        pBuf[iRcvd] = NULL;
        // Nachricht in einen CString kopieren
        strRecvd = pBuf;
        // Nachricht in Listenfeld der empfangenen Nachrichten eintragen
        m_ctlRecvd.AddString(strRecvd);
        // Variablen mit den Steuerelementen synchronisieren
        UpdateData(FALSE);
    }

}



m_iType = die Variable mit der ich sage ob ich Server bin oder Client
m_clientindex = welcher socket grade in benuzung ist. Die kommt immer bei dem Socketarray vom accept zum einsatz.
m_client = variable einer selbsterstellten Klasse namens client.


C++:
class client
{
public:
    client (/*int standartid*/) {clientsocket=0;}
    ~client(){}
    void setclientid(int id){clientid = id;}
    void setclientsocket(double socket){clientsocket = socket;}
    int getclientid(){return clientid;}
    double getclientsocket(){return clientsocket;}
private:
    int clientid;
    double clientsocket;
};




Also, ich habe da jetzt schon nen bissel drin rumgeschrieben, habe aber jetzt nen Knoten im Hirn, kann also nen bissel quatsch im syntax stehen, liegt daran, dass ich noch net soviel damit zu tun hatte.

Bin für jede Hilfe dankbar.

THX
TOM
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.08.2003, 08:26 Uhr
~Tom
Gast


Wollte nur meinen Post wieder etwas nachvorne bringen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.08.2003, 11:19 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Und der Fehler liegt nicht beim Array?

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.08.2003, 11:31 Uhr
~Tom
Gast


Hi,

das kann ich dir leider net sagen, jedenfalls geht der Debugger net über

C++:
if (m_iType == 1)



hinweg. Da macht er mir den Runtime und steht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.08.2003, 11:52 Uhr
~Tom
Gast


Im Endefekt muss ich doch eigentlich nur rausbekommen welcher Socket die OnReceive() ausgelöst hat, oder?

Mit welchem "CodeSchnippsel" kann man sowas?

Habe auch eine Überschriebene funktion

C++:
void CMySocket::OnReceive(int nErrorCode)
{

if (nErrorCode == 0)
// Nein, OnReceive-Funktion des Dialogfelds aufrufen
((CSockets1Dlg*)m_pWnd)->OnReceive();
}



Habe schon versucht es mit pointern irgentwie zu Übergeben. Bin aber leider auf kein Ergebniss gekommen.

THX
TOM
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.08.2003, 12:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Bau das Zeug anders:

ListenSocket -> Array aus anderen Sockets, bei Accept wird da jeweils eins angenommen.
In diesen musst du ja nicht switchen, jedes Element des Arrays hat ja eine eigene OnReceive-Funktion...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.08.2003, 12:38 Uhr
~Tom
Gast



C++:
void CSockets1Dlg::OnBconnect()
{
...
// Läuft Anwendung als Client oder Server?
if (m_iType == 0)
{
    // Client, einen Standard-Socket erzeugen
    m_sConnectSocket[m_clientindex].Create();
    // Verbindung zum Server öffnen
    m_sConnectSocket[m_clientindex].Connect(m_strName, m_iPort);
}
else
{
    // Server, einen Socket für den angegebenen Anschluß erzeugen
    m_sListenSocket.Create(m_iPort);
    // Auf Verbindungsgesuche hören
    m_sListenSocket.Listen();
}
}

void CSockets1Dlg::OnAccept()
{
// Verbindungsanforderung annehmen
m_clientindex = clientauswahl();
m_sListenSocket.Accept(m_sConnectSocket[m_clientindex]);
m_client[m_clientindex].setclientsocket (m_sConnectSocket[m_clientindex].m_hSocket);
// Steuerelemente für Text und Nachrichten aktivieren
...
}



Der ListenSocket bleibt doch bei CAsyncSocket immer stehen und hört und gibt die anfrage dann weiter an OnAccept() oder?
Danach ist der LisenSocket doch wieder frei zum hören auf Verbindungsanfragen.

OnAccept() gibt doch dann der Anfrage einen socket für die kommunikation (bei mir m_sConnectSocket[]) und diesen muss ich doch in einen Array machen das ich mit mehreren Sockets arbeiten kann.
*bitte korrigieren wenn falsch*

THX
TOM
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.08.2003, 13:06 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


würde nicht server und client in ein socket packen, das meinte ich vorhin
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.08.2003, 13:48 Uhr
~Tom
Gast



Zitat:
würde nicht server und client in ein socket packen


Sorry, verstehe ich net. Wo habe ich das getan?

THX
TOM
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.08.2003, 14:47 Uhr
Spacelord
Hoffnungsloser Fall


Dein Server sollte nur zur Verbindungsaufnahme dienen und die eigentliche Kommunikation mit dem Client solltest du in eine Extra Thread auslagern(für jeden Client einen).
So würde ich es auf jeden Fall machen .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: