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 + -
显示快捷键?