UNIX - Socket
-
Hi,
ich komm einfach nicht dahinter wie ich diese probleme hier lösen soll
Compiler :g++ ircbot.cpp -o ircbot ircbot.cpp: In function »int main()«: ircbot.cpp:21: Fehler: Argument des Typs »const char* (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »char*« ircbot.cpp:22: Fehler: Argument des Typs »const char* (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »char*« ircbot.cpp:23: Fehler: Argument des Typs »const char* (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »char*« ircbot.cpp:24: Fehler: Argument des Typs »const char* (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »char*« ircbot.cpp:37: Fehler: no match für »operator=« in »addr.sockaddr_in::sin_addr = inet_addr(((const char*)((char*)(& serverip))))« /usr/include/netinet/in.h:138: Anmerkung: Kandidaten sind: in_addr& in_addr::operator=(const in_addr&) ircbot.cpp:39: Fehler: Ungültiger L-Wert in Zuweisung ircbot.cpp:63: Fehler: Argument des Typs »size_t (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »size_t« ircbot.cpp:64: Fehler: Argument des Typs »size_t (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »size_t« ircbot.cpp:74: Fehler: Argument des Typs »size_t (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »size_t« ircbot.cpp:84: Fehler: Argument des Typs »size_t (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »size_t«
Sourcecode
#include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <cstring> #include <arpa/inet.h> #include <netdb.h> using namespace std; int main() { int sock; if( (sock=socket(AF_INET,SOCK_STREAM,0) ) == -1) cout << "Fehler :Socket erstellen\n"; cout << "[*]Socket erstellen"; //++++++++++++++++++++++++++++++++++++++++++++++++ string zugangsdaten[5]; strcpy(zugangsdaten[0].c_str , "test123"); strcpy(zugangsdaten[1].c_str , "test1234"); strcpy(zugangsdaten[2].c_str , "test.org"); strcpy(zugangsdaten[3].c_str , "testChannel"); //+++++++++++++++++++++++++++++++++++++++++++++++++ struct sockaddr_in addr; char serverip[20]; hostent *dns = gethostbyname(zugangsdaten[2].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]); memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(6667); addr.sin_addr = inet_addr(serverip); if(connect(sock,(sockaddr*)&addr,sizeof(addr)) = -1) cout << "Fehler : Connect()"; cout << "[*]Connect"; char temp[10000]; int x = recv(sock,temp,1000,0); temp[x]= 0; //+++++++++++++++++++++++++++++++++++++++++++ string nick = "NICK "; 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); x =recv(sock,temp,10000,0); temp[x] = 0; //+++++++++++++++++++++++++++++++++++++++++++ string join = "JOIN "; join += zugangsdaten[3]; join += "\r\n"; send(sock,join.c_str(),join.length,0); x = recv(sock,temp,10000,0); temp[x]= 0; //+++++++++++++++++++++++++++++++++++++++++++ close(sock); return 0; }
danke
-
peterlustig1245 schrieb:
Sourcecode
... int sock; if( (sock=socket(AF_INET,SOCK_STREAM,0) ) == -1) cout << "Fehler :Socket erstellen\n"; cout << "[*]Socket erstellen"; /* 1. UNIX Socket??!!! -> Du baust hier zumindest mal einen TCP Stream Socket 2. "if" geht nich -> dann gib nen Fehler aus, aber versuch's trotzdem mal! - fehlt da nich was, exit(EXIT_FAILURE) oder return -1 oder so? //*/ //++++++++++++++++++++++++++++++++++++++++++++++++ string zugangsdaten[5]; strcpy(zugangsdaten[0].c_str , "test123"); strcpy(zugangsdaten[1].c_str , "test1234"); strcpy(zugangsdaten[2].c_str , "test.org"); strcpy(zugangsdaten[3].c_str , "testChannel"); //+++++++++++++++++++++++++++++++++++++++++++++++++ /* nimm strncpy() wenn Du programmieren willst oder strcpy() wenn Du lieber debuggen willst und gerne nach out of bounds errors suchst //*/ struct sockaddr_in addr; char serverip[20]; hostent *dns = gethostbyname(zugangsdaten[2].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]); memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(6667); addr.sin_addr = inet_addr(serverip); /* das folgende hier sieht mir etwas seltsam aus, ich gebe aber zu, die letzten Sockest eher rudimentaer mit bind, listen und accept zusammengeschraubt zu haben und bin in Sockets nicht wirklich drin.. zumindest war es da so, dass Du den Server in einer while Schleife auf einen bis mehrere clients arbeiten laesst und eben listen bzw accept benutzt (welches blockierend ist, wenn kein Client da ist). Schliesslich lagert man die Verbindung zum client per fork oder in einem entsprechenden Thread aus. Ich sehe hier weder Schleife noch Fork o.ae. (nja, sollte vllt auch ohne letzteres gehen) aber da antwortet hier sicher noch wer.. //*/ if(connect(sock,(sockaddr*)&addr,sizeof(addr)) = -1) cout << "Fehler : Connect()"; cout << "[*]Connect"; ... }
-
habs jetz nochma überarbeitet klappt aber immer noch nicht
achja und ich wollte erstma nur testen
dann würde ich das in funktionen packen und z:B die funktion sendmsg(); in einen thread starten
sourcecode :#include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <cstring> #include <arpa/inet.h> #include <netdb.h> using namespace std; int main() { int sock = socket(AF_INET,SOCK_STREAM,0); if(sock == 0){ cout << "Fehler :Socket erstellen\n"; return -1; } cout << "[*]Socket erstellt"; //++++++++++++++++++++++++++++++++++++++++++++++++ string zugangsdaten[5]; char datenTmp[30]; std::cout<< "Nick: "; std::cin.getline(datenTmp, 30, '\n'); zugangsdaten[0] = datenTmp; std::cout<< "Name: "; std::cin.getline(datenTmp, 30, '\n'); zugangsdaten[1] = datenTmp; std::cout<< "Server: "; std::cin.getline(datenTmp, 30, '\n'); zugangsdaten[2] = datenTmp; std::cout<< "Raum: "; std::cin.getline(datenTmp, 30, '\n'); zugangsdaten[3] = datenTmp; //+++++++++++++++++++++++++++++++++++++++++++++++++ struct sockaddr_in addr; char serverip[20]; hostent *dns = gethostbyname(zugangsdaten[2].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]); memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(6667); addr.sin_addr = inet_addr(serverip); if(connect(sock,(sockaddr*)&addr,sizeof(addr)) = -1) cout << "Fehler : Connect()"; cout << "[*]Connect"; char temp[10000]; int x = recv(sock,temp,1000,0); temp[x]= 0; //+++++++++++++++++++++++++++++++++++++++++++++++ string nick = "NICK "; 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); x =recv(sock,temp,10000,0); temp[x] = 0; cout << "[*]Paket:Zugangsdaten geschickt" << endl; //+++++++++++++++++++++++++++++++++++++++++++++ string join = "JOIN "; join += zugangsdaten[3]; join += "\r\n"; send(sock,join.c_str(),join.length,0); x = recv(sock,temp,10000,0); temp[x]= 0; cout << "[*]Join in Channel" << endl; //+++++++++++++++++++++++++++++++++++++++++++ cout << "[*]Socket wird geschlossen"<<endl; close(sock); return 0; }
Fehler:
c4pone@ubuntu:~/Desktop$ g++ ircbot.cpp -o ircbot ircbot.cpp: In function »int main()«: ircbot.cpp:51: Fehler: no match für »operator=« in »addr.sockaddr_in::sin_addr = inet_addr(((const char*)((char*)(& serverip))))« /usr/include/netinet/in.h:138: Anmerkung: Kandidaten sind: in_addr& in_addr::operator=(const in_addr&) ircbot.cpp:55: Fehler: Ungültiger L-Wert in Zuweisung ircbot.cpp:80: Fehler: Argument des Typs »size_t (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »size_t« ircbot.cpp:81: Fehler: Argument des Typs »size_t (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »size_t« ircbot.cpp:92: Fehler: Argument des Typs »size_t (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::)()const« passt nicht zu »size_t«
-
Hallo, ich glaube Du hast mich nicht ganz verstanden... genauso wie Deinen Compiler, also der scheint zumindest mit der Zuweisung Probleme zu haben, evtl musst Du den operator= richtig ueberladen oder die richtigen Typen zuweisen.
Das ist anfangs etwas verwirrend mit den Sockets, evtl schau mal hier nach:
http://beej.us/guide/bgnet/output/html/singlepage/bgnet.htmlSenden is schon klar, aber von wo nach wo? Von einem Prozess zu einem anderen (das waere der Fall bei Unix Sockets) oder ueber's Netz. Nja, schau Dir mal den Link an, dann siehste schon.
-
zum 1. Fehler: inet_addr() liefer ein in_addr_t. addr.sin_addr ist aber eine struct vom Typ in_addr. Du musst das Ergebnis von inet_addr() and addr.sin_addr.s_addr zuweisen.
Ist vielleicht nicht ganz so leicht zu erkennen, aber die anderen hätte man durch genaues Lesen der Meldung und Hinschauen erkennen können, deshalb gibt's dazu auch nur Hinweise.
zum 2. Fehler: In Zeile 55 versuchst Du der Rückgabe des Befehls connect etwas zuzuweisen.
zum 3.-5. Fehler: Du versuchst send nicht die Länge des Strings zu übergeben, sondern die Methode der Klasse std::string, die die Länge ermittelt. Du musst die Methode aufrufen, um ihr Ergebnis zu erhalten.