2 Clienten sollen über 1 Server kommunizieren



  • <EDIT>
    KOMMANDO ZURÜCK!!!!!!!! Fehler gefunden 🙂 Der andere Thread, der die Nachrichten auch noch abhandelt wurde nicht richitg beendet...dieser hängt nämlich in einer while(TRUE)-Schleife fest, in der Winsock ihn blockt (wegen recv...wartet ja so lange, bis der Thread beendet wurde). Ein TerminateThread reicht da nicht...das schlägt fehl, ich denke eben aufgrund des Winsockblocks...aber wie beende ich den Thread dann, obwohl er im Winsockblock hängt?
    </EDIT>

    Hallo!
    Ich habe ein Programm geschrieben für eSportler, indem man Gegner finden kann....wie das funktioniert spielt keine Rolle. Nur so viel...ich habe für jeden Teilnehmer einen eigenen Thread, sobald zwei Teilnehmer zusammenpassen, will ich über meinen Server eine Chatverbindung zwischen den beiden herstellen, dafür beende ich deren Threads (welcher alle Nachrichten abgeholt hat und verarbeitet hat), und erstelle 2 neue Chatthreads. Als Parameter erwartet der Thread einen Zeiger auf ein struct. In dem Struct sind 2 Sockets (Synchrone Sockets). Der Thread empfängt einfach in einer while-Schleife alles vom 1. Socket und schickt es zum 2. Socket (im Struct). Das ist ja mein Ziel, alles vom Client1 soll zum Server gehen und dann zum Client2. Somit sind im Struct für den zweiten Thread die Sockets vertauscht (da die Nachrichten vom Socket1 zum Socket2 weitergeleitet werden). Das ganze sieht in etwa so aus:

    struct SocketPacket{
    	SOCKET socket1;
    	SOCKET socket2;
    };
    
    SocketPacket* newSocketPacket = new SocketPacket;
    newSocketPacket->socket1 = Teilnehmer1;
    newSocketPacket->socket2 = Teilnehmer2;
    SocketPacket* newSocketPacket2 = new SocketPacket;
    newSocketPacket2->socket1 = Teilnehmer2;
    newSocketPacket2->socket2 = Teilnehmer1;
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ClientCommunication, newSocketPacket2, 0, 0));
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ClientCommunication, newSocketPacket, 0, 0));
    
    void ClientCommunication(SocketPacket* sp)
    {
    
    	while(TRUE)
    	{
    		BYTE buf[2148];
    		MessageBox(0, "ES WIRD VERSUCHT WAS ZU EMPFANGEN", 0, 0);
    		int iRet = recv(sp->socket1, (char*)buf, 2148, 0);
    		MessageBox(0, "ES KOMMT WAS VOM CLIENTEN", "Server", 0);
    
    		if(iRet == SOCKET_ERROR || iRet == 0)
    		{
    			closesocket(sp->socket1);
    			goto exit;
    		}
    		iRet = send(sp->socket2, (char*)buf, iRet, 0);
    		if(iRet == SOCKET_ERROR || iRet == 0)
    		{
    			closesocket(sp->socket2);
    			goto exit;
    		}
    		}
    
    exit:
    
    	if(sp)
    	delete sp;
    }
    

    Das Problem ist nun, dass wenn die Chatverbindung zwischen beiden hergestellt wurde die Nachrichten nur teilweise übermittelt werden. Wenn Teilnehmer1 etwas abschickt kommt nichts an. Wenn er es nochmal abschickt kommt es an. Also IMMER beim 2. Versuch. Komischerweise klappt beim Teilnehmer2 JEDER Versuch. Habt ihr eine Ahnung woran das liegen könnte? Zum Start der Threads wird 2mal
    "ES WIRD VERSUCHT WAS ZU EMPFANGEN" ausgegeben, wenn Teilnehmer1 einen erfolgreichen Versuch hat, etwas zu übermitteln kommt (beim Server natürlich) "ES KOMMT WAS VOM CLIENTEN", wenn er einen erfolglosen Versuch abschickt kommt gar nichts. Bei Teilnehmer2 kommt IMMER "ES KOMMT WAS VOM CLIENTEN"....das send von den Clienten gibt bei JEDEM Versuch immer die korrekte Anzahl von Bytes zurück...also am send liegt es nicht! ICH HOFFE IHR KÖNNT MIR HELFEN.

    Gruß,
    Kevin


Anmelden zum Antworten