C++ & MFC - 2 Programme miteinander kommunizieren lassen per Netzwerk?

Dying Cry

Vice Admiral Special
Mitglied seit
05.01.2002
Beiträge
971
Renomée
0
Standort
Göttingen
Huhu ihr Lieben :)

Ich habe ein Problem.

Ich habe ein Programm, das soll auf meinem und nem zweitem Rechner gestartet werden und dann sollen die Programme miteinander kommunizieren. So wie einen Chat.

Ich habe das Programm jetzt so, dass das eine einen Socket öffnet, drauf horch und wenn was kommt, es accepted und dann per Receive die Daten empfängt und das andere Programm öffnet ebenfalls nen Socket, versucht per Connect zu verbinden und sendet per Send Daten.

Das Problem ist nur, wie programmiere ich das Ganze so, dass es wirklich wie ein Chat untereinander funktioniert? Jeder kann senden und jeder empfangen?

Senden:
Code:
if(!m_socket.Create(NULL, SOCK_STREAM, m_ip))
			ok = 0;
		else
		{			
			if(!m_socket.Connect(m_ip, m_port))
				ok = 0;
			else
			{		
				m_strMessage.Empty();

				m_ctrlName.GetWindowText(m_strName);
				m_ctrlMessage.GetWindowText(m_strMessage);

				m_strMessage.Insert(0, m_strName + ": ");
				m_strMessage.Insert(m_strMessage.GetLength(), "\r\n");

				char* message = (char*) calloc( sizeof(char), m_strMessage.GetLength() );

				strcpy(message, m_strMessage);
				
				if(!m_socket.Send(message, m_strMessage.GetLength()))
					ok = 0;
				else
					OnCLEAR();

				free(message);
			}
		}

Empfangen:
Code:
if(!sock.Create(x->m_port, SOCK_STREAM))
		x->MessageBox("Error while creating socket!", "Error");
	else
	{		
		x->m_strChat.Insert(x->m_strChat.GetLength(), "Socket created... \r\n");
		x->InvalidateText();

		char* message = (char*) calloc ( sizeof(char), 100 );
		
		x->m_strChat.Insert(x->m_strChat.GetLength(), "Server is listening... \r\n");
		x->InvalidateText();
		
		x->m_btClient.EnableWindow(0);
		x->m_btServer.EnableWindow(0);

		while(sock.Listen())
		{
			CSocket *pCSock = new CSocket();
			if(sock.Accept(*pCSock))
			{						
				if(pCSock->Receive(message, 100) > 0)
				{					
					x->m_strChat.Insert(x->m_strChat.GetLength(), message);
					x->InvalidateText();
				}
			}
			delete pCSock;
		}
	}

Schon mal vielen Dank :D *attacke*
 
Zuletzt bearbeitet:
Sockets sind bidirektional, d.h. wechselseitiges write/read ist möglich

Den Socket nach der Verbindungsphase einfach offen lassen

Das Lesen in einem seperaten Thread laufen lassen, also entweder zeichenweise (1 char) blockierend lesen oder feste Messagelänge vereinbaren oder in einem Messageheader mitteilen, wie lang der folgende Messagebody ist

Schließen des Kanals sollte erkannt werden, re-connect sollte dann funktionieren

Da ist 'ne Menge Fummelkram dabei, viel Erfolg! ;)
 
Zuletzt bearbeitet:
dank dir Nachtschicht, aber ich habs auch schon hingekriegt. Das Problem war, das ich nen Socket für Senden und einen Socket auf nem anderen Port fürs Empfangen brauchte. Und ich habe beides über den selben Port probiert, da standen sie sich natürlich im Weg, das Listen und das Receive ;)


Aber ich dank dir!
 
So, ich bins nochmal :)

Wie schon gesagt, habe jetzt einen Socket offen mit 2 Ports. Einen Port zum horchen und einen zum Senden. Wenn beide auf LOCALHOST sind klappt das auch, aber nicht übers Netzwerk.

Was muß ich beachten wenn ich sowas über ein Netzwerk machen will? Es gibt keine Firewall oder ähnliches... Die IPs stimmen.
 
Zurück
Oben Unten