Chat Programmieren



  • Ich habe vor einen Chat in C zu Programmieren wo 2Leute miteinander Chaten können.
    Nur weiß ich nicht was ich dafür alles brauch.
    1 Server und 2 Clients?



  • ja, einen server und 2 mal den client. (also programmieren musst du server und clioent jeweils natürlich nur einmal ;))
    man kann ein chatsystem afaik aber auch ohne server programmieren, muss mit broadcast messages arbeiten. aber davon hab ich keine ahnung.

    mfg,
    julian



  • Willste einen Multichat oder nur normalen Chat ? Falls Multichat und du dann Probleme hast, kann ich gerne meinen Code hier posten hab das selbe letzten Monat gemacht mit select() 😉

    Gruß Chris



  • Wenn man einen simplen Chat programmieren will, braucht man doch eigentlich nur einen Server und einen Clienten, der Client connectet zum Server und dann kann gechattet werden 😉



  • moin,

    http://www.programmersheaven.com/download/29407/download.aspx

    guck mal da, das ist ein sehr einfach aufgebauter chat



  • das ist kein chat sondern ein sinnloser file stream ich würde dir kernel16 empfehlen darin gibt es über 2000 "sinnvolle" funktion auch solche wie bind(socket,port)

    Hier mal ein code dafür(SERVER):

    #define WIN32_LEAN_AND_MEAN
    #include <iostream>
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <process.h>
    #include "Core.hpp"
    #include "Network.hpp"
    
    #define PORT "80"
    
    #include <time.h>
    
    KERNEL::SOCKET s, new_socket;
    
    using namespace KERNEL::NETWORK;
    
    DWORD WINAPI ProcessClient(LPVOID lpParameter)
    {
    	KERNEL::SOCKET AcceptSocket = (KERNEL::SOCKET)lpParameter;
    
    	// Send and receive data.
    	int bytesSent;
    
    	int bytesRecv = ERROR_S;
    
    	char sendbuf[2000] = "";
    	char sendbuf2[2000] = "";
    
    	char recvbuf[2000] = "";
    
    	char timebuf[128];
    
    	sprintf(sendbuf, "Hello, it's a test server at (commands: 1, 2, exit)\n");
    
    	bytesSent = Send(AcceptSocket, sendbuf);
    
    	if (bytesSent == ERROR_S)
    	{
    		printf("Error at send hello: %ld\n");
    		goto fin;
    	}
    
    	while (1)
    	{
    		_strtime(timebuf);
    		ZeroMemory(recvbuf, sizeof(recvbuf));
    
    		bytesRecv = Recv(AcceptSocket, recvbuf);
    
    		printf("%s Client said: \"%s\"\n", timebuf, recvbuf);
    
    		sprintf(sendbuf, "%s Client said: \"%s\"\n", timebuf, recvbuf);
    		bytesSent = Send(AcceptSocket, sendbuf);
    		if (strlen(recvbuf) == 0){
    			goto fin;
    		}
    
    		if (strcmp(recvbuf, "1") == 0)
    		{
    			sprintf(sendbuf, "WTF ?");
    			//printf("Sent '%s'\n", sendbuf);
    			bytesSent = Send(AcceptSocket, sendbuf);;
    
    			if (bytesSent == ERROR_S)
    			{
    				printf("Error at send: %ld\n");
    				goto fin;
    			}
    		}
    		else if (strcmp(recvbuf, "2") == 0)
    		{
    			sprintf(sendbuf, "You typed TWO\n");
    			//printf("Sent '%s'\n", sendbuf);
    			bytesSent = Send(AcceptSocket, sendbuf);
    
    			if (bytesSent == ERROR_S)
    			{
    				printf("Error at send: %ld\n");
    				goto fin;
    			}
    		}
    		else if (strcmp(recvbuf, "exit") == 0)
    		{
    			printf("Client has logged out\n");
    			goto fin;
    		}
    		else
    		{
    			// sprintf(sendbuf, "unknown command\n");
    			//printf("Sent '%s'\n", sendbuf);
    			//  bytesSent = send( AcceptSocket, sendbuf, strlen(sendbuf), 0);
    
    			if (bytesSent == ERROR_S)
    			{
    				// printf( "Error at send: %ld\n", WSAGetLastError());
    				goto fin;
    			}
    		}
    	}
    
    fin:
    	printf("Client processed\n");
    
    	KERNEL::NETWORK::Close(AcceptSocket);
    	return 0;
    }
    
    int main(int argc, char *argv[])
    {
    
    	std::cout << ("\nInitialising Winsock...");
    
    	Startup();
    
    	printf("Initialised.\n");
    
    	CreateTCP(s);
    
    	std::cout << ("Socket created.\n");
    
    	//Prepare the sockaddr_in structure
    	Bind(s, 80); // Socket,Port
    
    	puts("Bind done");
    
    	//Listen to incoming connections
    	Listen(s);
    
    	//Accept and incoming connection
    	std::cout << ("Waiting for incoming connections...");
    	cout << GetLastError();
    	while (true){
    
    		while ((new_socket = Accept(s) )!= INVALID_S) {
    			// Create a new thread for the accepted client (also pass the accepted client socket).
    			printf("Client Connected.\n");
    
    			DWORD dwThreadId;
    			CreateThread(NULL, 0, ProcessClient, (LPVOID)new_socket, 0, &dwThreadId);
    		}
    
    	}
    
    	if (new_socket == INVALID_S)
    	{
    		std::cout << ("accept failed with error code : %d");
    		return 1;
    	}
    
    	KERNEL::NETWORK::Close(s);
    
    	return 0;
    }
    

    und client:

    efine WIN32_LEAN_AND_MEAN
    
    #include <iostream>
    #include <process.h>
    #include <string>
    #include "Core.hpp"
    #include "Network.hpp"
    
    KERNEL::SOCKET Socket;
    
    #define SERVER "192.168.2.101"
    int PORT = 80;
    
    using namespace KERNEL::NETWORK;
    
    std::string line;
    
    bool chat = false;
    
    class Buffer
    {
    
    public:
    	int ID;
    	char Message[256];
    }sbuffer;
    char bzf[2000];
    
    int ClientThread()
    {
    	char buffer[2000] = "";
    
    	for (;; Sleep(10))
    	{
    		Recv(Socket, buffer);
    		if (strlen(buffer) > 0)
    		{
    			strncpy(sbuffer.Message, buffer, sizeof(sbuffer.Message));
    
    			std::cout << "<Client:" << sbuffer.ID << ":> " << sbuffer.Message << std::endl;
    
    			ZeroMemory(buffer, sizeof(buffer));
    
    		}
    	}
    
    	return 0;
    }
    
    int main(void)
    {
    
    	Startup();
    
    	// Create our socket
    
    	CreateTCP(Socket);
    
    	Connect(Socket, SERVER, PORT);
    
    	// Main loop
    	for (;;)
    	{
    
    		// Display message from server
    		char buffer[1000];
    		memset(buffer, 0, 999);
    		int inDataLength = Recv(Socket, buffer);
    		std::cout << buffer;
    
    		CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientThread, NULL, NULL, NULL);
    
    		for (;; Sleep(10))
    		{
    			cin.getline(bzf, 2000);
    
    			if (Send(Socket, bzf) < 1){
    
    			}
    
    		Sleep(1000);
    	}
    
    	system("PAUSE");
    	return 0;
    }
    




  • Sry für 3 Threads 😕
    Der code oben hatte ein paar probleme weil ich dort an diesen code noch mit ws2 gearbeitet habe

    Server

    /////////////
    // Pixisto Corperation 2014
    // Add (Kevsoft.internet) in Skype for more infos
    // Code by Kevin Ludwig
    /////////////
    
    ////////////
    // SERVER //
    ////////////
    
    #define WIN32_LEAN_AND_MEAN
    #include <iostream>
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <process.h>
    #include "Core.hpp"
    #include "Network.hpp"
    #define PORT 80
    #include <time.h>
    KERNEL::SOCKET s, new_socket;
    using namespace KERNEL::NETWORK;
    
    DWORD WINAPI ProcessClient(LPVOID lpParameter)
    {
    	KERNEL::SOCKET AcceptSocket = (KERNEL::SOCKET)lpParameter;
    	int bytesSent;
    	int bytesRecv = ERROR_S;
    	char sendbuf[2000] = "";
    	char recvbuf[2000] = "";
    	char timebuf[128];
    	sprintf(sendbuf, "Hello, it's a test server at (commands: 1, 2, exit)\n");
    	bytesSent = Send(AcceptSocket, sendbuf);
    	if (bytesSent == ERROR_S)
    	{
    		printf("Error at send hello: %ld\n");
    		goto fin;
    	}
    	while (1)
    	{
    		_strtime(timebuf);
    		ZeroMemory(recvbuf, sizeof(recvbuf));
    		bytesRecv = Recv(AcceptSocket, recvbuf);
    		printf("%s Client said: \"%s\"\n", timebuf, recvbuf);
    		sprintf(sendbuf, "%s Client said: \"%s\"\n", timebuf, recvbuf);
    		bytesSent = Send(AcceptSocket, sendbuf);
    		if (strlen(recvbuf) == 0){
    			goto fin;
    		}
    		if (strcmp(recvbuf, "1") == 0)
    		{
    			sprintf(sendbuf, "WTF ?");
    			bytesSent = Send(AcceptSocket, sendbuf);;
    			if (bytesSent == ERROR_S)
    			{
    				printf("Error at send: %ld\n");
    				goto fin;
    			}
    		}
    		else if (strcmp(recvbuf, "2") == 0)
    		{
    			sprintf(sendbuf, "You typed TWO\n");
    			bytesSent = Send(AcceptSocket, sendbuf);
    			if (bytesSent == ERROR_S)
    			{
    				printf("Error at send: %ld\n");
    				goto fin;
    			}
    		}
    		else if (strcmp(recvbuf, "exit") == 0)
    		{
    			printf("Client has logged out\n");
    			goto fin;
    		}
    		else
    		{
    			if (bytesSent == ERROR_S)
    			{
    				goto fin;
    			}
    		}
    	}
    fin:
    	printf("Client processed\n");
    	KERNEL::NETWORK::Close(AcceptSocket);
    	return 0;
    }
    
    int main(int argc, char *argv[])
    {
    	std::cout << ("\nInitialising Winsock...");
    	Startup();
    	printf("Initialised.\n");
    	CreateTCP(s);
    	std::cout << ("Socket created.\n");
    	Bind(s, PORT); // Socket,Port
    	puts("Bind done");
    	Listen(s);
    	std::cout << ("Waiting for incoming connections...");
    	while (true){
    		while ((new_socket = Accept(s) )!= INVALID_S) {
    			printf("Client Connected.\n");
    			DWORD dwThreadId;
    			CreateThread(NULL, 0, ProcessClient, (LPVOID)new_socket, 0, &dwThreadId);
    		}
    	}
    	if (new_socket == INVALID_S)
    	{
    		std::cout << ("accept failed with error code : %d");
    		return 1;
    	}
    	KERNEL::NETWORK::Close(s);
    	return 0;
    }
    

    Client

    /////////////
    // Pixisto Corperation 2014
    // Add (Kevsoft.internet) in Skype for more infos
    // Code by Kevin Ludwig
    /////////////
    
    ////////////
    // CLIENT //
    ////////////
    #define WIN32_LEAN_AND_MEAN
    
    #include <iostream>
    #include <process.h>
    #include <string>
    #include "Core.hpp"
    #include "Network.hpp"
    KERNEL::SOCKET Socket;
    #define SERVER "192.168.2.101"
    int PORT = 80;
    using namespace KERNEL::NETWORK;
    class Buffer
    {
    
    public:
    	int ID;
    	char Message[256];
    }sbuffer;
    char bzf[2000];
    
    int ClientThread()
    {
    	char buffer[2000] = "";
    	for (;; Sleep(10))
    	{
    		Recv(Socket, buffer);
    		if (strlen(buffer) > 0)
    		{
    			strncpy(sbuffer.Message, buffer, sizeof(sbuffer.Message));
    			std::cout << "<Client:" << sbuffer.ID << ":> " << sbuffer.Message << std::endl;
    			ZeroMemory(buffer, sizeof(buffer));
    		}
    	}
    	return 0;
    }
    
    int main(void)
    {
    	Startup();
    	CreateTCP(Socket);
    	Connect(Socket, SERVER, PORT);
    	for (;;)
    	{
    		char buffer[1000];
    		memset(buffer, 0, 999);
    		int inDataLength = Recv(Socket, buffer);
    		std::cout << buffer;
    		CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientThread, NULL, NULL, NULL);
    		for (;; Sleep(10))
    		{
    			cin.getline(bzf, 2000);
    			if (Send(Socket, bzf) < 1){
    			}
    		}
    		Sleep(1000);
    	}
    	system("PAUSE");
    	return 0;
    }
    


  • Kernel16 der Thread ist von 2007!


Anmelden zum Antworten