oosocket.c

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

C
720
字号
   memset (&m_addr, 0, sizeof (m_addr));   m_addr.sin_family = AF_INET;   m_addr.sin_port = htons ((unsigned short)port);   m_addr.sin_addr.s_addr = inet_addr (host);   if (connect (socket, (struct sockaddr *) (void*) &m_addr,                 sizeof (struct sockaddr_in)) == -1)   {      return ASN_E_INVSOCKET;   }   return ASN_OK;}/*// **Need to add check whether complete data was sent by checking the return// **value of send and if complete data is not sent then add mechanism to // **send remaining bytes. This will make ooSocketSend call atomic.*/int ooSocketSend (OOSOCKET socket, const ASN1OCTET* pdata, ASN1UINT size){   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;      if (send (socket, (const char*) pdata, size, SEND_FLAGS) == -1)      return ASN_E_INVSOCKET;   return ASN_OK;}int ooSocketSendTo(OOSOCKET socket, const ASN1OCTET* pdata, ASN1UINT size,                     const char* host, int port){   struct sockaddr_in m_addr;   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;      memset (&m_addr, 0, sizeof (m_addr));   m_addr.sin_family = AF_INET;   m_addr.sin_port = htons ((unsigned short)port);   m_addr.sin_addr.s_addr = inet_addr (host);   if (sendto (socket, (const char*) pdata, size, SEND_FLAGS,                                     (const struct sockaddr*)&m_addr,                                     sizeof(m_addr)) == -1)      return ASN_E_INVSOCKET;   return ASN_OK;}int ooSocketRecvPeek(OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize){   int len;   int flags = MSG_PEEK;   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;   if ((len = recv (socket, (char*) pbuf, bufsize, flags)) == -1)      return ASN_E_INVSOCKET;   return len;}int ooSocketRecv (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize){   int len;   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;   if ((len = recv (socket, (char*) pbuf, bufsize, 0)) == -1)      return ASN_E_INVSOCKET;   return len;}int ooSocketRecvFrom (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize,                      char* remotehost, ASN1UINT hostBufLen, int * remoteport){   struct sockaddr_in m_addr;   int len, addrlen;   char * host=NULL;   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;   addrlen = sizeof(m_addr);   memset (&m_addr, 0, sizeof (m_addr));         if ((len = recvfrom (socket, (char*) pbuf, bufsize, 0,                         (struct sockaddr*)&m_addr, &addrlen)) == -1)      return ASN_E_INVSOCKET;   if(remoteport)      *remoteport = ntohs(m_addr.sin_port);   if(remotehost)   {      host = inet_ntoa(m_addr.sin_addr);      if(strlen(host) < (hostBufLen-1))         strcpy(remotehost, host);      else         return -1;   }   return len;}int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds,                      fd_set *exceptfds, struct timeval * timeout){   int ret;   #if defined (_WIN32)  ret = select(nfds, readfds, writefds, exceptfds,              (const struct timeval *) timeout);#else   ret = select(nfds, readfds, writefds, exceptfds, timeout);#endif   return ret;}int ooGetLocalIPAddress(char * pIPAddrs){   int ret;   struct hostent *phost;   struct in_addr addr;   char hostname[100];   if(pIPAddrs == NULL)      return -1; /* Need to find suitable return value */   ret = gethostname(hostname, 100);   if(ret == 0)   {      phost = gethostbyname(hostname);      if(phost == NULL)         return -1; /* Need to define a return value if made part of rtsrc */      memcpy(&addr, phost->h_addr_list[0], sizeof(struct in_addr));      strcpy(pIPAddrs, inet_ntoa(addr));        }   else{      return -1;   }   return ASN_OK;}int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr) {   int b1, b2, b3, b4;   int rv = sscanf (pIPAddrStr, "%d.%d.%d.%d", &b1, &b2, &b3, &b4);   if (rv != 4 ||      (b1 < 0 || b1 > 256) || (b2 < 0 || b2 > 256) ||      (b3 < 0 || b3 > 256) || (b4 < 0 || b4 > 256))      return ASN_E_INVPARAM;   *pIPAddr = ((b1 & 0xFF) << 24) | ((b2 & 0xFF) << 16) |               ((b3 & 0xFF) << 8) | (b4 & 0xFF);   return ASN_OK;}int ooSocketConvertIpToNwAddr(char *inetIp, char *netIp){   struct sockaddr_in sin = {0};#ifdef _WIN32   sin.sin_addr.s_addr = inet_addr(inetIp);   if(sin.sin_addr.s_addr == INADDR_NONE)   {      OOTRACEERR1("Error:Failed to convert address\n");      return -1;   }#else   if(!inet_aton(inetIp, &sin.sin_addr))   {      OOTRACEERR1("Error:Failed to convert address\n");      return -1;   }  #endif      memcpy(netIp, (char*)&sin.sin_addr.s_addr, sizeof(unsigned long));   return ASN_OK;}int ooSocketAddrToStr (OOIPADDR ipAddr, char* pbuf, int bufsize){   char buf1[5], buf2[5], buf3[5], buf4[5];   int cnt = 0;   if (bufsize < 8)       return ASN_E_BUFOVFLW;   cnt += sprintf (buf1, "%lu", (ipAddr >> 24) & 0xFF);   cnt += sprintf (buf2, "%lu", (ipAddr >> 16) & 0xFF);   cnt += sprintf (buf3, "%lu", (ipAddr >> 8) & 0xFF);   cnt += sprintf (buf4, "%lu", ipAddr & 0xFF);   if (bufsize < cnt + 4)      return ASN_E_BUFOVFLW;   sprintf (pbuf, "%s.%s.%s.%s", buf1, buf2, buf3, buf4);   return ASN_OK;}int ooSocketsCleanup (void){#ifdef _WIN32   int ret = WSACleanup();   if(ret == 0)      return ASN_OK;   else      return ret;#endif   return ASN_OK;}long ooSocketHTONL(long val){   return htonl(val);}short ooSocketHTONS(short val){   return htons(val);}#ifndef _WIN32int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList){   OOSOCKET sock;   struct ifconf ifc;   int ifNum;   OOInterface *pIf=NULL;   OOTRACEDBGA1("Retrieving local interfaces\n");   if(ooSocketCreateUDP(&sock)!= ASN_OK)   {      OOTRACEERR1("Error:Failed to create udp socket - "                  "ooSocketGetInterfaceList\n");         return -1;   }#ifdef SIOCGIFNUM   if(ioctl(sock, SIOCGIFNUM, &ifNum) >= 0)   {      OOTRACEERR1("Error: ioctl for ifNum failed\n");      return -1;   }#else   ifNum = 50;#endif    ifc.ifc_len = ifNum * sizeof(struct ifreq);   ifc.ifc_req = (struct ifreq *)memAlloc(pctxt, ifNum *sizeof(struct ifreq));   if(!ifc.ifc_req)   {      OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - ifc.ifc_req\n");      return -1;   }   if (ioctl(sock, SIOCGIFCONF, &ifc) >= 0) {      void * ifEndList = (char *)ifc.ifc_req + ifc.ifc_len;      struct ifreq *ifName;      struct ifreq ifReq;      int flags;      for (ifName = ifc.ifc_req; (void*)ifName < ifEndList; ifName++) {         char *pName=NULL;         char addr[50], mask[50];                  pIf = (struct OOInterface*)memAlloc(pctxt, sizeof(struct OOInterface));         pName = (char*)memAlloc(pctxt, strlen(ifName->ifr_name)+1);         if(!pIf)         {            OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - "                        "pIf/pName\n");            return -1;         }         OOTRACEDBGA2("\tInterface name: %s\n", ifName->ifr_name);                           strcpy(ifReq.ifr_name, ifName->ifr_name);         strcpy(pName, ifName->ifr_name);         pIf->name = pName;         /* Check whether the interface is up*/         if (ioctl(sock, SIOCGIFFLAGS, &ifReq) < 0) {            OOTRACEERR2("Error:Unable to determine status of interface %s\n",                         pName);            memFreePtr(pctxt, pIf->name);            memFreePtr(pctxt, pIf);            continue;         }         flags = ifReq.ifr_flags;         if (!(flags & IFF_UP)) {            OOTRACEWARN2("Warn:Interface %s is not up\n", pName);            memFreePtr(pctxt, pIf->name);            memFreePtr(pctxt, pIf);            continue;         }	 /* Retrieve interface address */         if (ioctl(sock, SIOCGIFADDR, &ifReq) < 0)          {            OOTRACEWARN2("Warn:Unable to determine address of interface %s\n",                           pName);            memFreePtr(pctxt, pIf->name);            memFreePtr(pctxt, pIf);            continue;         }         strcpy(addr, inet_ntoa(((struct sockaddr_in*)&ifReq.ifr_addr)->sin_addr));         OOTRACEDBGA2("\tIP address is %s\n", addr);         pIf->addr = (char*)memAlloc(pctxt, strlen(addr)+1);         if(!pIf->addr)         {            OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - "                        "pIf->addr\n");            memFreePtr(pctxt, pIf->name);            memFreePtr(pctxt, pIf);            return -1;         }         strcpy(pIf->addr, addr);         #ifdef ifr_netmask         if (ioctl(sock, SIOCGIFNETMASK, &ifReq) < 0)          {            OOTRACEWARN2("Warn:Unable to determine mask for interface %s\n",                           pName);            memFreePtr(pctxt, pIf->name);            memFreePtr(pctxt, pIf->addr);            memFreePtr(pctxt, pIf);            continue;         }         strcpy(mask, inet_ntoa(((struct sockaddr_in *)&ifReq.ifr_netmask)->sin_addr));         OOTRACEDBGA2("\tMask is %s\n", mask);         pIf->mask = (char*)memAlloc(pctxt, strlen(mask)+1);         if(!pIf->mask)         {            OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - "                        "pIf->mask\n");            memFreePtr(pctxt, pIf->name);            memFreePtr(pctxt, pIf->addr);            memFreePtr(pctxt, pIf);            return -1;         }         strcpy(pIf->mask, mask);#endif         pIf->next = NULL;         /* Add to the list */         if(!*ifList)         {            *ifList = pIf;            pIf = NULL;         }else{            pIf->next = *ifList;            *ifList = pIf;            pIf=NULL;         }/*#if defined(OO_FREEBSD) || defined(OO_OPENBSD) || defined(OO_NETBSD) || defined(OO_MACOSX) || defined(OO_VXWORKS) || defined(OO_RTEMS) || defined(OO_QNX)#ifndef _SIZEOF_ADDR_IFREQ#define _SIZEOF_ADDR_IFREQ(ifr) \        ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \         (sizeof(struct ifreq) - sizeof(struct sockaddr) + \          (ifr).ifr_addr.sa_len) : sizeof(struct ifreq))#endif      ifName = (struct ifreq *)((char *)ifName + _SIZEOF_ADDR_IFREQ(*ifName));#else      ifName++;*/      }   }     return ASN_OK;}#endif

⌨️ 快捷键说明

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