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