SIGSEGV verursacht durch aufruf von FD_SET
-
Hallo in die Runde.
Ich habe wiedermal ein Problem bei dem ich eure Hilfe brauche.
Wie in der überschrift bereits erwähnt wird bei meinem Programm ein SIGSEGV signal empfangen und daruafhin natürlich abgebrochen. Ich kann mir nicht erklären wo dieser Fehler herkommt.1. Fehlermeldung erzeugt von gdb:
Program received signal SIGSEGV, Segmentation fault. 0x08051c92 in socketx::confSelect (this=0x805fbd0, sec=5, usec=0) at socketx.cpp:20 20 FD_SET(sock, &fds); (gdb) where #0 0x08051c92 in socketx::confSelect (this=0x805fbd0, sec=5, usec=0) at socketx.cpp:20 #1 0x080522f7 in socketx::TCP_send (this=0x805fbd0, obuf=0xbfffebec "", byteCount=12) at socketx.cpp:118 #2 0x0804f490 in devRead::readValue (this=0xbfffebd4, valueInterprete=..., regNo=1, startReg=2, sockNr=1) at devRead.cpp:67 #3 0x08053186 in main (argc=1, argv=0xbffff394) at watchDog.cpp:1642. Code (angeblicher verursacher in File socketx.cpp line 20)
void socketx::confSelect(int sec, int usec){ FD_ZERO(&fds); FD_SET(sock, &fds); // !!Hier tritt angeblich der fehler auf!!! tv.tv_sec = sec; tv.tv_usec = usec; // timeout für select nach 500 microsekunden }Die aufrufende Fkt. (aus der selben klasse)
int socketx::TCP_send(char* obuf, int byteCount){//gibt anzahl der gesendeten bytes zurück this->confSelect(5, 0);//fdset und timeout setzen sockRValue = select(sock+1, NULL, &fds, NULL, &tv); if (sockRValue <= 0){ throw SockExcept("[socket:TCP_send] Server Antwortet nicht (evtl netzwerk problem, timeout)",1016); } sockRValue = send(sock, obuf, byteCount, 0); if (sockRValue == -1){ throw SockExcept("[socket::TCP_send] Fehler beim Senden der Daten",1011); } return sockRValue; }3. Das dazugehörige headerfile:
#ifndef SOCKETX_H_ #define SOCKETX_H_ #include <string> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <unistd.h> #include <sstream> #include <iostream> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <errno.h> using namespace std; class socketx{ public: socketx(); // Konstruktor int init(string ipAdress, int port); int TCP_send(char* obuf, int byteCount); int TCP_recv(unsigned char* ibuf, int byteCount); private: int sock; //id des sockets int error; // Vaiabel um error auf zu nehmen int sockRValue; struct hostent *ip_adrs; struct sockaddr_in server_addr; const char *adresse; unsigned long ip; fd_set fds; struct timeval tv; void confSelect(int sec, int usec); }; class SockExcept{ private: string except; int eno; public: SockExcept(string s, int eno) : except(s) {this->eno= eno;} ~SockExcept(){} string get_SockExcept(int &eno) {eno=this->eno; return except;} }; #endif /* SOCKETX_H_ */Ich hoffe ihr könnt mir wie immer Helfen.
Mfg BabComPS: Danke schon mal vorab ^^^^
-
Weißt du, ob
thisgültig ist?
-
Überdenke mal die Klasse. Was mir so spontan auffällt:
- nie
using namespaceim Header! #includeam besten alles, da alles viel hilft?<sstream>,<iostream>sind beispielsweise überflüssig.- Exception Klasse nicht von
std::exceptionabgeleitet - Ich bezweifle, dass alle Membervariablen wirklich notwendig sind, um den Zustand eines Sockets zu halten. In der Regel reicht der Filedeskriptor.
TCP_senderwartet einen nicht konstanten Zeiger. Was will denn TCP_send da rein schreiben?TCP_sendarbeitet mitchar*,TCP_recvaber mitunsigned char*.- Zeiger als member (
addresse,ip_adrs) verlangen in der Regel nach einem Kopierkonstruktor und Zuweisungsoperator.
Das das Programm bei dem Programmierstil abstürzt wundert mich nicht wirklich.
- nie
-
HI, danke für die Antworten.
Also Wenn ich das namespace std; aus der hederdatei(en) entferne, bekomme ich in fast allen Klassen Probleme mit den membervariablen bzw. den übergabeparametern.
(string, stringstream, vektor etc. werden nicht mehr erkannt). Wenn ich das also nicht so machen darf/soll wie soll ich das dann machen?sstream und iostream haste auc hrecht sind hier überflüssig geworden hatten in dem ursprünglichem entwurf aber durch aus ihren sinn. (Rausgenommen)
TCPsend, da haste recht das als Zeiger zu übergeben ist eigentlich quatsch. werde ich ändern.
TCP Recv ist so richtig(denke ich), da der ModbusTCP Master mit einem unsigned char array antwortet, welches dann byte weise ausgewertet werden muss.
(richtige Antwort, Error, etc.).
-
das ich die Exeption nicht von std::exeption abgeleitet habe hatt den grund, dass mir da eine eigene (sehr abgespeckte) klasse gebaut habe, welche den selben mechanismus benutzt.
-
BabCom schrieb:
HI, danke für die Antworten.
Also Wenn ich das namespace std; aus der hederdatei(en) entferne, bekomme ich in fast allen Klassen Probleme mit den membervariablen bzw. den übergabeparametern.
(string, stringstream, vektor etc. werden nicht mehr erkannt). Wenn ich das also nicht so machen darf/soll wie soll ich das dann machen?Explizite Qualifikation natürlich. std::string usw.
-
ah klar^^ danke,
werde ich umgehend ändern.
-
Hatt den noch jemand eine idee was diesen Fehler auslösen könnte? ich binn natürlich auch für weitere formale verbesserungen offen ^^.
Mfg BabCom
-
BabCom schrieb:
Also Wenn ich das namespace std; aus der hederdatei(en) entferne, bekomme ich in fast allen Klassen Probleme mit den membervariablen bzw. den übergabeparametern.
(string, stringstream, vektor etc. werden nicht mehr erkannt). Wenn ich das also nicht so machen darf/soll wie soll ich das dann machen?aufgrund dieser aussage vermute ich, dass der code nicht vom te selbst geschrieben / verstanden wurde.
-
BabCom schrieb:
Hatt den noch jemand eine idee was diesen Fehler auslösen könnte?
Nimm doch mal zu Sones Frage Stellung.
-
tja also ich habe den Fehler im endefekt gefunden.
Problem wahr, das ich in einer anderen Klasse bestimme wieviele Sockets angelegt werden müssen oben bennante klasse veranlasst mittels der init Fkt einen anzulegen . dabei habe ich mir einen kleinen Fehler geleistet (hatte an einer stelle ein +1 drinne weshalb 1 socket zuviel angelegt wurde), dies wiederum führte dazu das versucht wurde auf einen socket zuschreiben welcher nicht existiert daher der fehler.
@Sones: ja der this-> zeiger ist gülltig.
Danke für eure Hilfe. Auch wenn ihr den fFhler garnicht finden konntet ^^ so habt ihr mir doch bei einigen vormalen dingen helfen können.
MfG BabCom