From ad02d4572f164db8dcc2b83dea538d54eea6f9e4 Mon Sep 17 00:00:00 2001 From: lotodore Date: Thu, 8 Feb 2007 00:19:40 +0000 Subject: [PATCH] Added socket helper functions. --- src/net/genericsocket.h | 33 +++++++++++++++++ src/net/linux/socket_helper.c | 41 +++++++++++++++++++++ src/net/linux/socket_startup.c | 35 ++++++++++++++++++ src/net/socket_helper.h | 60 ++++++++++++++++++++++++++++++ src/net/socket_startup.h | 27 ++++++++++++++ src/net/win32/socket_helper.c | 37 +++++++++++++++++++ src/net/win32/socket_startup.c | 67 ++++++++++++++++++++++++++++++++++ 7 files changed, 300 insertions(+) create mode 100644 src/net/genericsocket.h create mode 100644 src/net/linux/socket_helper.c create mode 100644 src/net/linux/socket_startup.c create mode 100644 src/net/socket_helper.h create mode 100644 src/net/socket_startup.h create mode 100644 src/net/win32/socket_helper.c create mode 100644 src/net/win32/socket_startup.c diff --git a/src/net/genericsocket.h b/src/net/genericsocket.h new file mode 100644 index 00000000..390b6056 --- /dev/null +++ b/src/net/genericsocket.h @@ -0,0 +1,33 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +/* Platform independent socket include header. */ +#ifndef _GENERICSOCKET_H_ +#define _GENERICSOCKET_H_ + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#include +#endif + +#endif + diff --git a/src/net/linux/socket_helper.c b/src/net/linux/socket_helper.c new file mode 100644 index 00000000..c1a90135 --- /dev/null +++ b/src/net/linux/socket_helper.c @@ -0,0 +1,41 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifdef _WIN32 +#error This source code is not for Win32. +#endif + +#include "socket_helper.h" + + +bool +socket_string_to_addr(const char *str, int addrFamily, struct sockaddr * addr, int addrLen) +{ + if (addrFamily == AF_INET) + return (inet_pton(addrFamily, str, &((struct sockaddr_in *)addr)->sin_addr) == 1); + else if (addrFamily == AF_INET6) + return (inet_pton(addrFamily, str, &((struct sockaddr_in6 *)addr)->sin6_addr) == 1); + else + return false; +} + +bool +socket_resolve(const char *str, int addrFamily, int sockType, int protocol, struct sockaddr *addr, int addrLen) +{ +} + diff --git a/src/net/linux/socket_startup.c b/src/net/linux/socket_startup.c new file mode 100644 index 00000000..40cb2dfc --- /dev/null +++ b/src/net/linux/socket_startup.c @@ -0,0 +1,35 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifdef _WIN32 +#error This source code is not for Win32. +#endif + +#include "socket_startup.h" + +bool +socket_startup() +{ + return true; +} + +void +socket_cleanup() +{ +} + diff --git a/src/net/socket_helper.h b/src/net/socket_helper.h new file mode 100644 index 00000000..ab19e5e2 --- /dev/null +++ b/src/net/socket_helper.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +/* Socket helper defines and functions. */ +#ifndef _SOCKET_HELPER_H_ +#define _SOCKET_HELPER_H_ + +#include "genericsocket.h" + +#ifndef bzero + #include + #define bzero(_ptr, _n) std::memset(_ptr, 0, _n) +#endif + +#ifdef _WIN32 +#define CLOSESOCKET closesocket +#else +#define SOCKET int +#define SOCKET_ERROR -1 +#define INVALID_SOCKET -1 +#define CLOSESOCKET close +#endif + +#define IS_VALID_SOCKET(_s) ((_s) != INVALID_SOCKET) +#define IS_VALID_CONNECT(_c) ((_c) == 0) +#define IS_VALID_RECV(_r) ((_r) != SOCKET_ERROR) +#define IS_VALID_SEND(_s) ((_s) != SOCKET_ERROR) +#define IS_VALID_BIND(_b) ((_b) != SOCKET_ERROR) + +// All char *s are assumed to be UTF-8. + +/** + * Convert an address string to a numeric address. + * str is assumed to be UTF-8 encoded. + */ +bool socket_string_to_addr(const char *str, int addrFamily, struct sockaddr *addr, int addrLen); + +/** + * Resolve a name to a numeric address. + * str is assumed to be UTF-8 encoded. + */ +bool socket_resolve(const char *str, int addrFamily, int sockType, int protocol, struct sockaddr *addr, int addrLen); + +#endif + diff --git a/src/net/socket_startup.h b/src/net/socket_startup.h new file mode 100644 index 00000000..f395ef91 --- /dev/null +++ b/src/net/socket_startup.h @@ -0,0 +1,27 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +/* Socket startup/cleanup functions (required for Win32). */ +#ifndef _SOCKET_STARTUP_H_ +#define _SOCKET_STARTUP_H_ + +bool socket_startup(); +void socket_cleanup(); + +#endif + diff --git a/src/net/win32/socket_helper.c b/src/net/win32/socket_helper.c new file mode 100644 index 00000000..65501732 --- /dev/null +++ b/src/net/win32/socket_helper.c @@ -0,0 +1,37 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _WIN32 +#error This source code is Win32 only. +#endif + +#include "socket_helper.h" + + +bool +socket_string_to_addr(const char *str, int addrFamily, struct sockaddr * addr, int addrLen) +{ + // TODO: convert str from UTF-8 to UTF-16 (Win32 byte order) + //return (WSAStringToAddress((wchar_t *)str, addrFamily, NULL, addr, &addrLen) != SOCKET_ERROR); +} + +bool +socket_resolve(const char *str, int addrFamily, int sockType, int protocol, struct sockaddr *addr, int addrLen) +{ +} + diff --git a/src/net/win32/socket_startup.c b/src/net/win32/socket_startup.c new file mode 100644 index 00000000..60d4d178 --- /dev/null +++ b/src/net/win32/socket_startup.c @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _WIN32 +#error This source code is Win32 only. +#endif + +#include + +#define USE_SOCKET_VERSION_MAJOR 2 +#define USE_SOCKET_VERSION_MINOR 2 + +bool +socket_startup() +{ + WORD wVersionRequested; + WSADATA wsaData; + int err; + + wVersionRequested = MAKEWORD(USE_SOCKET_VERSION_MAJOR, USE_SOCKET_VERSION_MINOR); + err = WSAStartup(wVersionRequested, &wsaData); + if (err != 0) + { + /* Tell the user that we could not find a usable */ + /* WinSock DLL. */ + return false; + } + + /* Confirm that the WinSock DLL supports 2.2.*/ + /* Note that if the DLL supports versions greater */ + /* than 2.2 in addition to 2.2, it will still return */ + /* 2.2 in wVersion since that is the version we */ + /* requested. */ + + if (LOBYTE(wsaData.wVersion) != USE_SOCKET_VERSION_MAJOR || + HIBYTE(wsaData.wVersion) != USE_SOCKET_VERSION_MINOR) { + /* Tell the user that we could not find a usable */ + /* WinSock DLL. */ + WSACleanup(); + return false; + } + + /* The WinSock DLL is acceptable. Proceed. */ + return true; +} + +void +socket_cleanup() +{ + WSACleanup(); +} +