oosocket.c

来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 720 行 · 第 1/2 页

C
720
字号
/* * Copyright (C) 1997-2005 by Objective Systems, Inc. * * This software is furnished under an open source license and may be  * used and copied only in accordance with the terms of this license.  * The text of the license may generally be found in the root  * directory of this installation in the COPYING file.  It  * can also be viewed online at the following URL: * *   http://www.obj-sys.com/open/license.html * * Any redistributions of this file including modified versions must  * maintain this copyright notice. * *****************************************************************************/#include "ooSocket.h"#include "ootrace.h"#if defined(_WIN32_WCE)static int inited = 0;#define SEND_FLAGS     0#define SHUTDOWN_FLAGS 0#elif defined (_WIN32)static LPFN_SEND send;static LPFN_SOCKET socket;static LPFN_SETSOCKOPT setsockopt;static LPFN_BIND bind;static LPFN_HTONL htonl;static LPFN_HTONS htons;static LPFN_CONNECT connect;static LPFN_INET_ADDR inet_addr;static LPFN_LISTEN listen;static LPFN_ACCEPT accept;static LPFN_NTOHL ntohl;static LPFN_NTOHS ntohs;static LPFN_RECV recv;static LPFN_SHUTDOWN shutdown;static LPFN_IOCTLSOCKET ioctlsocket;static LPFN_SENDTO sendto;static LPFN_INET_NTOA inet_ntoa;static LPFN_RECVFROM recvfrom;static LPFN_SELECT select;static LPFN_GETHOSTNAME gethostname;static LPFN_GETHOSTBYNAME gethostbyname;static LPFN_WSAGETLASTERROR  WSAGetLastError;static LPFN_WSACLEANUP WSACleanup;static LPFN_CLOSESOCKET closesocket;static LPFN_GETSOCKNAME getsockname;static HMODULE ws32 = 0;#define SEND_FLAGS     0#define SHUTDOWN_FLAGS SD_BOTH#else#define SEND_FLAGS     0#define SHUTDOWN_FLAGS SHUT_RDWR#define closesocket close#endifint ooSocketsInit (){#if defined(_WIN32_WCE)   WORD wVersionRequested;   WSADATA wsaData;   int err;   if (inited) return ASN_OK;    wVersionRequested = MAKEWORD( 1, 1 );       err = WSAStartup (wVersionRequested, &wsaData);   if ( err != 0 ) {      /* Tell the user that we could not find a usable */      /* WinSock DLL.   */      return ASN_E_NOTINIT;   }   inited = 1;#elif defined (_WIN32)   LPFN_WSASTARTUP wsaStartup = NULL;   WSADATA wsaData;   if (ws32 != 0) return ASN_OK;//   ws32 = LoadLibrary ("WSOCK32.DLL");  ws32 = LoadLibrary ("WS2_32.DLL");   if (ws32 == NULL) return ASN_E_NOTINIT;      wsaStartup = (LPFN_WSASTARTUP) GetProcAddress (ws32, "WSAStartup");   if (wsaStartup == NULL) return ASN_E_NOTINIT;      send = (LPFN_SEND) GetProcAddress (ws32, "send");   if (send == NULL) return ASN_E_NOTINIT;      socket = (LPFN_SOCKET) GetProcAddress (ws32, "socket");   if (socket == NULL) return ASN_E_NOTINIT;      setsockopt = (LPFN_SETSOCKOPT) GetProcAddress (ws32, "setsockopt");   if (setsockopt == NULL) return ASN_E_NOTINIT;      bind = (LPFN_BIND) GetProcAddress (ws32, "bind");   if (bind == NULL) return ASN_E_NOTINIT;      htonl = (LPFN_HTONL) GetProcAddress (ws32, "htonl");   if (htonl == NULL) return ASN_E_NOTINIT;      htons = (LPFN_HTONS) GetProcAddress (ws32, "htons");   if (htons == NULL) return ASN_E_NOTINIT;      connect = (LPFN_CONNECT) GetProcAddress (ws32, "connect");   if (connect == NULL) return ASN_E_NOTINIT;      listen = (LPFN_LISTEN) GetProcAddress (ws32, "listen");   if (listen == NULL) return ASN_E_NOTINIT;      accept = (LPFN_ACCEPT) GetProcAddress (ws32, "accept");   if (accept == NULL) return ASN_E_NOTINIT;      inet_addr = (LPFN_INET_ADDR) GetProcAddress (ws32, "inet_addr");   if (inet_addr == NULL) return ASN_E_NOTINIT;      ntohl = (LPFN_NTOHL) GetProcAddress (ws32, "ntohl");   if (ntohl == NULL) return ASN_E_NOTINIT;      ntohs = (LPFN_NTOHS) GetProcAddress (ws32, "ntohs");   if (ntohs == NULL) return ASN_E_NOTINIT;      recv = (LPFN_RECV) GetProcAddress (ws32, "recv");   if (recv == NULL) return ASN_E_NOTINIT;      shutdown = (LPFN_SHUTDOWN) GetProcAddress (ws32, "shutdown");   if (shutdown == NULL) return ASN_E_NOTINIT;      closesocket = (LPFN_CLOSESOCKET) GetProcAddress (ws32, "closesocket");   if (closesocket == NULL) return ASN_E_NOTINIT;   getsockname = (LPFN_GETSOCKNAME) GetProcAddress (ws32, "getsockname");   if (getsockname == NULL) return ASN_E_NOTINIT;      ioctlsocket = (LPFN_IOCTLSOCKET) GetProcAddress(ws32, "ioctlsocket");   if(ioctlsocket == NULL) return ASN_E_NOTINIT;   sendto = (LPFN_SENDTO) GetProcAddress (ws32, "sendto");   if (sendto == NULL) return ASN_E_NOTINIT;   inet_ntoa = (LPFN_INET_NTOA) GetProcAddress (ws32, "inet_ntoa");   if (inet_ntoa == NULL) return ASN_E_NOTINIT;   recvfrom = (LPFN_RECVFROM) GetProcAddress (ws32, "recvfrom");   if (recvfrom == NULL) return ASN_E_NOTINIT;   select = (LPFN_SELECT) GetProcAddress (ws32, "select");   if (select == NULL) return ASN_E_NOTINIT;   gethostname = (LPFN_GETHOSTNAME) GetProcAddress (ws32, "gethostname");   if (gethostname == NULL) return ASN_E_NOTINIT;   gethostbyname = (LPFN_GETHOSTBYNAME) GetProcAddress (ws32, "gethostbyname");   if (gethostbyname == NULL) return ASN_E_NOTINIT;      WSAGetLastError = (LPFN_WSAGETLASTERROR) GetProcAddress (ws32,                                                            "WSAGetLastError");   if (WSAGetLastError == NULL) return ASN_E_NOTINIT;   WSACleanup = (LPFN_WSACLEANUP) GetProcAddress (ws32, "WSACleanup");   if (WSACleanup == NULL) return ASN_E_NOTINIT;            if (wsaStartup (MAKEWORD(1, 1), &wsaData) == -1) return ASN_E_NOTINIT;#endif   return ASN_OK;}#if defined (_WIN32) || \defined(_HP_UX) || defined(__hpux) || defined(_HPUX_SOURCE)typedef int OOSOCKLEN;#elsetypedef size_t OOSOCKLEN;#endifint ooSocketCreate (OOSOCKET* psocket) {   int on;   struct linger linger;   OOSOCKET sock = socket (AF_INET,                             SOCK_STREAM,                             0);     if (sock == OOSOCKET_INVALID){      OOTRACEERR1("Error:Failed to create TCP socket\n");      return ASN_E_INVSOCKET;   }   on = 1;   if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,                    (const char* ) &on, sizeof (on)) == -1)   {      OOTRACEERR1("Error:Failed to set socket option SO_REUSEADDR\n");      return ASN_E_INVSOCKET;   }   linger.l_onoff = 1;   linger.l_linger = 0;   if (setsockopt (sock, SOL_SOCKET, SO_LINGER,                    (const char* ) &linger, sizeof (linger)) == -1)   {      OOTRACEERR1("Error:Failed to set socket option linger\n");      return ASN_E_INVSOCKET;   }   *psocket = sock;   return ASN_OK;}int ooSocketCreateUDP (OOSOCKET* psocket) {   int on;   struct linger linger;   OOSOCKET sock = socket (AF_INET,                             SOCK_DGRAM,                             0);   if (sock == OOSOCKET_INVALID){      OOTRACEERR1("Error:Failed to create UDP socket\n");      return ASN_E_INVSOCKET;   }   on = 1;   if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,                    (const char* ) &on, sizeof (on)) == -1)   {      OOTRACEERR1("Error:Failed to set socket option SO_REUSEADDR\n");      return ASN_E_INVSOCKET;   }   linger.l_onoff = 1;   linger.l_linger = 0;   /*if (setsockopt (sock, SOL_SOCKET, SO_LINGER,                  (const char* ) &linger, sizeof (linger)) == -1)      return ASN_E_INVSOCKET;   */   *psocket = sock;   return ASN_OK;}int ooSocketClose (OOSOCKET socket){   shutdown (socket, SHUTDOWN_FLAGS);   if (closesocket (socket) == -1)      return ASN_E_INVSOCKET;   return ASN_OK;}int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port) {   struct sockaddr_in m_addr;   if (socket == OOSOCKET_INVALID)   {       OOTRACEERR1("Error:Invalid socket passed to bind\n");      return ASN_E_INVSOCKET;   }   memset (&m_addr, 0, sizeof (m_addr));   m_addr.sin_family = AF_INET;   m_addr.sin_addr.s_addr = (addr == 0) ? INADDR_ANY : htonl (addr);   m_addr.sin_port = htons ((unsigned short)port);   if (bind (socket, (struct sockaddr *) (void*) &m_addr,                     sizeof (m_addr)) == -1)   {      perror ("bind");      OOTRACEERR1("Error:Bind failed\n");      return ASN_E_INVSOCKET;   }   return ASN_OK;}int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, int *size){   int ret;   ret = getsockname(socket, (struct sockaddr*)name, size);   if(ret == 0)      return ASN_OK;   else{      OOTRACEERR1("Error:ooSocketGetSockName - getsockname\n");      return ASN_E_INVSOCKET;   }}int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port){   int ret=ASN_OK, size;   struct sockaddr_in addr;   char *host=NULL;   size = sizeof(addr);   ret = ooSocketGetSockName(socket, &addr, &size);   if(ret != 0)      return ASN_E_INVSOCKET;   host = inet_ntoa(addr.sin_addr);   if(host && strlen(host) < (unsigned)len)      strcpy(ip, host);      else{     OOTRACEERR1("Error:Insufficient buffer for ip address - "                 "ooSocketGetIpAndPort\n");      return -1;   }      *port = addr.sin_port;   return ASN_OK;}int ooSocketListen (OOSOCKET socket, int maxConnection) {   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;   if (listen (socket, maxConnection) == -1)      return ASN_E_INVSOCKET;   return ASN_OK;}int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket,                     OOIPADDR* destAddr, int* destPort) {   struct sockaddr_in m_addr;   OOSOCKLEN addr_length = sizeof (m_addr);   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;   if (pNewSocket == 0) return ASN_E_INVPARAM;   *pNewSocket = accept (socket, (struct sockaddr *) (void*) &m_addr,                          &addr_length);   if (*pNewSocket <= 0) return ASN_E_INVSOCKET;   if (destAddr != 0)       *destAddr = ntohl (m_addr.sin_addr.s_addr);   if (destPort != 0)      *destPort = ntohs (m_addr.sin_port);   return ASN_OK;}int ooSocketConnect (OOSOCKET socket, const char* host, int port) {   struct sockaddr_in m_addr;   if (socket == OOSOCKET_INVALID)   {       return ASN_E_INVSOCKET;   }   

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?