Borland C++ Builder & das IRC tutorial?

2

23448241320410

ich habe keine ahnung, ob das nun hier reinpasst oder nicht,
oder ob man das direk zum tutorial schreiben muss, aber hier mal die frage:
ich habe vor, mich etwas mit AI lá ELiza zu beschäftigen, und wollte das ding chat fähig machen.
OK, da traf es sich gut, das ich hier gleich einen fertigen IRC clienten endeckt habe, den ich für meine zwecke doch hoffentlich erweitern kann.
soweit so gut, ich verstand im grund alles außer das SOCKET-zeug.
also, einfahc mal den quelltext rübergezogen, und leicht an den Borland C++ builder angepasst.
ich habe die ws2_32.lib über "Project hinzufügen" geaddet (aus dem lib ordner des Borland c++ builders)
und #pragma comment(lib, "ws2_32.lib") entfernt.
ok, als ich dne spaß dann compilen wollte, kam folgende fehrermeldung
[C++ Fehler] Unit1.cpp(46): E2268 Aufruf der undefinierten Funktion 'sprintf'
ok, ich habe #pragma comment(lib, "ws2_32.lib") nochmal geaddet, immernoch nix,
gleicher fehler.
naja, wo liegt der fehler?
hier das tutorial:
http://www.tutorials.de/forum/c-c-c...-hilfe-von-windows-sockets-programmieren.html

und hier der source, den ich benutze:
Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include <iostream>
#include <string.h>
#include <winsock.h>
#include <process.h>
#pragma argsused



void Zugangsdaten(std::string *zugangsdaten)
{
	char temp[30];

	std::cout<< "Nick: ";
	std::cin.getline(temp, 30, '\n');
	zugangsdaten[0] = temp;
	std::cout<< "Name: ";
	std::cin.getline(temp, 30, '\n');
	zugangsdaten[1] = temp;
	std::cout<< "Server: ";
	std::cin.getline(temp, 30, '\n');
	zugangsdaten[2] = temp;
	std::cout<< "Raum: ";
	std::cin.getline(temp, 30, '\n');
	zugangsdaten[3] = temp;
}

unsigned int VerbindenAnServer(std::string server, int port)
{
	SOCKET sock;
	char serverip[20];
	sockaddr_in addr;
	WSADATA wsaData;
	
	if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
		std::cout<<"WSA konnte nicht initialisiert werden.";

	hostent *dns = gethostbyname(server.c_str());

	sprintf(serverip, "%u.%u.%u.%u",
		(unsigned char) dns->h_addr_list[0][0],	(unsigned char) dns->h_addr_list[0][1],
		(unsigned char) dns->h_addr_list[0][2], (unsigned char) dns->h_addr_list[0][3]);  //hier tritt der Fehler auf

	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = inet_addr(serverip);

	sock = socket(AF_INET, SOCK_STREAM, 0);
	if(sock == 0)
		std::cout<<"Socket konnte nicht initialisiert werden";

	if(connect(sock, (sockaddr *) &addr, sizeof(addr)) == -1)
		std::cout<<"Verbindung konnte nicht hergestellt werden";
	
	char temp[10000];
	int x = recv(sock, temp, 10000, 0);
	temp[x] = 0;
	std::cout<< temp;

	return sock;
}

void AnmeldenAnServer(SOCKET sock, std::string *zugangsdaten)
{
	std::string nick = "NICK ";
	std::string user = "USER ";

	nick += zugangsdaten[0];
	nick += "\r\n";

	user += zugangsdaten[0];
	user += ' ';
	user += "localhost ";
	user += zugangsdaten[2];
	user += ' ';
	user += zugangsdaten[1];
	user += "\r\n";

	send(sock, nick.c_str(), nick.length(), 0);
	send(sock, user.c_str(), user.length(), 0);

	char temp[10000];
	int x = recv(sock, temp, 10000, 0);
	temp[x] = 0;
	std::cout<< temp;
}

void InRaumGehen(SOCKET sock, std::string *zugangsdaten)
{
	std::string join = "JOIN ";

	join += zugangsdaten[3];
	join += "\r\n";

	send(sock, join.c_str(), join.length(), 0);

	char temp[10000];
	int x = recv(sock, temp, 10000, 0);
	temp[x] = 0;
	std::cout<< temp;
}

void NachrichtenEmpfangen(void *sock)
{
	char ausgabe[1000];
	int x = 0;

	while(1)
	{
		x = recv((SOCKET)sock, ausgabe, 1000, 0);
		
		if(x > 0)
		{
			ausgabe[x] = 0;
			std::cout<< ausgabe << std::endl;
		}
		Sleep(10);
	}
}

void NachrichtenSenden(SOCKET sock)
{
	char temp[1000];
	std::string eingabe;

	while(1)
	{
		std::cin.getline(temp, 100, '\n');
		eingabe = temp;
		eingabe += "\r\n";

		send(sock, eingabe.c_str(), eingabe.length(), 0);
	}
}


//---------------------------------------------------------------------------


int main(int argc, char* argv[])
{
	SOCKET sock;
	std::string zugangsdaten[4];

	Zugangsdaten(zugangsdaten);
	sock = VerbindenAnServer(zugangsdaten[2], 6667);
	AnmeldenAnServer(sock, zugangsdaten);
	InRaumGehen(sock, zugangsdaten);
	_beginthread(NachrichtenEmpfangen, 0, (void *)sock);
	NachrichtenSenden(sock);

	std::cin.get();
	WSACleanup();
	return 0;
}
//---------------------------------------------------------------------------

vielen dank.
 

deepthroat

Erfahrenes Mitglied
Hi.

Die Fehlermeldung die du bekommst stammt vom Compiler, der dir sagt das er die Funktion nicht kennt. Das kann nichts mit irgendwelchen Bibliotheken zu tun haben weil diese erst beim Linken (vom Linker) hinzugezogen werden.

Was dir fehlt ist eine Header Datei wo die sprintf Funktion deklariert ist. Die Funktion sprintf ist eine Standardfunktion der C Bibliothek und als solche im Header <stdio.h> bzw. für C++ in <cstdio> deklariert.

Gruß