socket class portabel machen...
-
Dieser Thread wurde von Moderator/in flenders aus dem Forum WinAPI in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hi, versuch es mal mit perror(char*); müsste in der headerfile errno.h entalten sein, diese gibt bei einem Fehler gleich die passenden Kernel Message aus, also den letzen Fehler der festgestellt wurde. Natürlich gibt es auch eine function die errorcodes in string umwandelt, aber das is ja in dm letzen post beschrieben
-
std::string getErrorMessage() const { char* pMessageBuffer = ::strerror(errno); std::string errorMessage(pMessageBuffer); free(pMessageBuffer); return errorMessage; }
müsste so laufen, denk ich...
cu
-
std::string getErrorMessage() const { return ::strerror(errno); }
-
kommt ja aufs gleiche raus? code is halt kürzer...
cu
-
hi! ich weiß nit ob deine variante läuft @profi2!
::strerror(errno) is ja kein std::string...meines wissens nach is der rückgabewert von dieser funktion ein char*
aber will ja einen std::string zurückgeben;-)
cu
-
coder1 schrieb:
std::string getErrorMessage() const { char* pMessageBuffer = ::strerror(errno); std::string errorMessage(pMessageBuffer); free(pMessageBuffer); return errorMessage; }
müsste so laufen, denk ich...
nee, du darfst doch den String, den dir strerror() liefert nicht free()en.
Die kürzere Variante von Profi2 ist schon gut so. Das wird automatisch konvertiert.
-
ja da hast recht, free ist in diesem fall falsch, weil ich ja kein malloc oder so habe....
richtig:
std::string getErrorMessage() const { char* pMessageBuffer = ::strerror(errno); std::string errorMessage(pMessageBuffer); return errorMessage; }
wird das automatisch konvertiert meinst du bei profi2? warum eigentlich?
cu
-
Warum? Na weil std::string einen Konstruktor für char* hat.
Du benutzt diesen ja auch hier: std::string errorMessage(pMessageBuffer);
-
hab jetzt einige änderungen gemacht von winsocket auf linux socket....kann das so gehn mit der initalisierungsliste bei linux socket? die expection klasse hab ich nicht mitgepostet...
cu
/////////////// windows ///////////// class Socket { public: Socket(SOCKET socket) : socket_(socket) { assert(isValid()); } Socket(std::string IPAddress, unsigned short port) { socket_ = ::socket(AF_INET, SOCK_STREAM, 0); if(!isValid()) { THROW_SOCKET_EXCEPTION("::socket failed!"); } connect(IPAddress, port); } ~Socket() { ::closesocket(socket_); } private: SOCKET socket_; bool isValid() const { return socket_ != INVALID_SOCKET; } }; /////////////// linux ///////////// class Socket { public: Socket(int socket_) : socket(socket_) { assert(isValid()); } Socket(std::string IPAddress, unsigned short port) { socket_ = ::socket(AF_INET, SOCK_STREAM, 0); if(!isValid()) { THROW_SOCKET_EXCEPTION("::socket failed!"); } connect(IPAddress, port); } ~Socket() { ::close(socket_); } private: int socket_; bool isValid() const { return socket_ != -1; } };