c++ bot winsocks

05/01/2011 16:57 luckylukas92#1
hay,
wie schon in einem anderen thema gepostet, würde ich gerne einen bot für flyff programmieren -> habe mich ein wenig eingelesen und bin jetzt von der idee abgekommen, weil ich wohl EINDEUTIG nicht annehernd genug erfahrung habe um so etwas in c++ realisieren.

Deswegen habe ich beschlossen einen Browsergamebot o.ä. mit c++ zu erstellen, sodass ich wenigstens ein bisschen umgang mit winsocks habe.

Ich habe mir eine grafische oberfläche mit der winapi erstellt(und das hat welch wunder auch funktioniert!).
Danach habe ich mich in der msdn und verschiedenen foren(ich benutze kein mvc/vc++ express) über winsocks informiert.
Per button click rufe ich diese funktion auf:
->der pc soll nur eine verbindung auf bauen
Code:
BOOL setupConnection(HWND hWnd,SOCKET sock){
	const char szIPAddr[32] = {"178.63.1.69"};
	static struct sockaddr_in sa;
	WSADATA WSAData;
	int iError;
	if(iError = WSAStartup(MAKEWORD(2,0),&WSAData)){
		MessageBox(0,_T("FEHLER bei WSAStartup"),0,0);
		return true;
	}else{
		MessageBox(0,_T("WSA erfolgreich gestartet"),0,0);
	}
	//open socket
	sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(sock == INVALID_SOCKET){
		MessageBox(0,_T("Socket error...."),0,0);
		closesocket(sock);
		WSACleanup();
		return true;
	}else{
		MessageBox(0,_T("Socket steht"),0,0);
	}
	//async hinzufügen-> block stoppen
	if(SOCKET_ERROR == WSAAsyncSelect(sock,hWnd,WM_SOCKET_NOTIFY,FD_CONNECT|FD_READ)){
		MessageBox(0,_T("Async error...."),0,0);
		closesocket(sock);
		WSACleanup();
	}
	//connect
	sockaddr_in service; 
	sa.sin_family	=AF_INET;
	sa.sin_port		=(80);
	sa.sin_addr.S_un.S_addr =inet_addr(szIPAddr);
	connect(sock,(SOCKADDR*)&sa,sizeof(sa));
	if(WSAEWOULDBLOCK != (iError = WSAGetLastError())){
		MessageBox(0,_T("Connect error...."),0,0);
		closesocket(sock);
		WSACleanup();
		return true;
	}
	return true;
}
ich bin mir nich sicht aber ich glaube das funktioniert auch?
Hier wäre meine frage, wie kann ich das richtig in unicode umsetzen?
Code:
const char szIPAddr[32] = {"178.63.1.69"};
wäre dann doch:
Code:
const TCHAR szIPAddr[32] = _T("178.63.1.69");
?
//egal das ist jetzt eher nebensächlich
laut msdn wird dann in WM_SOCKET_NOTIFY, FD_CONNECT ausgelöst.-> das kann icha uch bestätigen
Code:
case WM_SOCKET_NOTIFY:
		WORD wEvent,wError;
		wEvent = WSAGETSELECTEVENT(lParam);//events
		wError = WSAGETSELECTERROR(lParam);//errors
		switch(wEvent){
			case FD_CONNECT:
				if(wError){
					MessageBox(0,_T("Connect error"),0,0);
					return true;
				}else{
					MessageBox(0,_T("Verbunden"),0,0);
				}
				recv(sock,(char*)&response,100,MSG_PEEK);
				break;
leider bekomme ich aber immer nen connect error ...
jmd ne idee woran das liegen könnte?
-> die ip existiert
MfG Lukas
05/01/2011 19:00 xNopex#2
Da du nach eigenen Angaben C++ verwendest, rate ich dringend zum Umgang mit std::wstring. Damit hast du dein unicode Problem elegant und einfach gelöst, als dass du dich da mit den ollen C-Strings abrackerst:

Quote:
std::wstring ip = L"178.63.1.69";
//...
sa.sin_addr.S_un.S_addr =inet_addr(ip.c_str());
EDIT: Nochmal zum Thema C++ und Network-Programmierung: Ich kann durchaus auch Boost::Asio empfehlen, dann musst du dich nicht mit den C-Funktionen der WinSock herumschlagen.
05/01/2011 19:41 luckylukas92#3
Hallo,
mein problem bestand eher im 2ten teil des posts :P, und nein ich möchte nicht auf andere libs umsteigen ... irgendwie muss es ja so gehen:
und
Quote:
std::wstring ip = L"178.63.1.69";
//...
sa.sin_addr.S_un.S_addr =inet_addr(ip.c_str());
so geht es leider nicht->
Error: "error C2664: 'inet_addr': Konvertierung des Parameters 1 von 'const wchar_t *' in 'const char *' nicht möglich"
trotzdem danke für die hilfe
MfG lukas
05/01/2011 20:00 xNopex#4
Quote:
Error: "error C2664: 'inet_addr': Konvertierung des Parameters 1 von 'const wchar_t *' in 'const char *' nicht möglich"
>> [Only registered and activated users can see links. Click Here To Register...]

Die Funktion nimmt also nur einen ASCII - String entgegen, wie mir gerade aufgefallen ist. Du müsstest den String daher wieder zurück ins ASCII Format bringen und da stellt mir die Frage, wieso du überhaupt auf UNICODE umsteigen möchtest... Und ich hatte das so verstanden, dass der zweite Teil eher nebensächlich ist ;) Aber gut..
Schau doch mal, was GetLastError() sagt.
05/01/2011 23:24 luckylukas92#5
ich möchte nicht auf unicode umsteigen -> habe mit der winapi/c++ bis jetzt erelativ wenig am hut gehabt und wollte gleich mit unicode anfangen...
GetLastError() habe ich shcon bemüht
... aber auch das ist keine Unicode funktion und ich bin mir nicht sicher , ob es evtl am falschen cast liegt, dass
MessageBox(0,(LPCWSTR),0,0); nichts liefert, bzw. eine leere messagebox :D

MfG Lukas
05/02/2011 15:52 xNopex#6
Get Last Error gibt einen unsigned long integer Wert zurück... Der ist weder unicode noch ascii? Ich würde halt mal versuchen via stringstream den integer-wert in einen string umzuwandeln und dann per OutputDebugString() oder whatever auszugeben...
05/02/2011 16:53 luckylukas92#7
okay ich gebs auf, ich muss mir wohl zu gestehen, dass der umstieg von php direkt zu c++ und winapi zu schwer(für mich) ist
... könnt ihr was anderes umpfehlen, oder kommt man um die winapi nicht rum?
MfG Lukas

edit: habe da was von qt gelesen aber das ist von nokia?
05/02/2011 17:09 .BritainAndy#8
05/02/2011 17:14 xNopex#9
Quote:
könnt ihr was anderes umpfehlen, oder kommt man um die winapi nicht rum?
[Only registered and activated users can see links. Click Here To Register...]