⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socket.c

📁 一个很好用的解析
💻 C
字号:
/*============================================================================  socket.c==============================================================================  Implementation of TSocket class: A generic socket over which one can  transport an HTTP stream or manage HTTP connections============================================================================*/#include <sys/types.h>#include <assert.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#include "mallocvar.h"#include "xmlrpc-c/util_int.h"#include "xmlrpc-c/abyss.h"#include "xmlrpc-c/util_int.h"#ifdef WIN32  #include "socket_win.h"#else  #include "socket_unix.h"#endif#include "socket.h"#ifdef WIN32  #include "socket_win.h"#else  #include "socket_unix.h"#endif#include "socket.h"static voidsocketOsInit(abyss_bool * const succeededP) {#ifdef WIN32    SocketWinInit(succeededP);#else    SocketUnixInit(succeededP);#endif}static voidsocketOsTerm(void) {#ifdef WIN32    SocketWinTerm();#else    SocketUnixTerm();#endif}    abyss_bool SocketTraceIsActive;abyss_boolSocketInit(void) {    abyss_bool retval;    socketOsInit(&retval);    SocketTraceIsActive = (getenv("ABYSS_TRACE_SOCKET") != NULL);    if (SocketTraceIsActive)        fprintf(stderr, "Abyss socket layer will trace socket traffic "                "due to ABYSS_TRACE_SOCKET environment variable\n");    return retval;}voidSocketTerm(void) {    socketOsTerm();}/* SocketCreate() is not exported to the Abyss user.  It is meant to   be used by an implementation-specific TSocket generator which is   exported to the Abyss user, e.g. SocketCreateUnix() in   socket_unix.c   The TSocket generator functions are the _only_ user-accessible   functions that are particular to an implementation.*/static uint const socketSignature = 0x060609;voidSocketCreate(const struct TSocketVtbl * const vtblP,             void *                     const implP,             TSocket **                 const socketPP) {    TSocket * socketP;    MALLOCVAR(socketP);    if (socketP) {        socketP->implP = implP;        socketP->vtbl = *vtblP;        socketP->signature = socketSignature;        *socketPP = socketP;    }}voidSocketDestroy(TSocket * const socketP) {    assert(socketP->signature == socketSignature);    socketP->vtbl.destroy(socketP);    socketP->signature = 0;  /* For debuggability */    free(socketP);}voidSocketWrite(TSocket *             const socketP,            const unsigned char * const buffer,            uint32_t              const len,            abyss_bool *          const failedP) {    (*socketP->vtbl.write)(socketP, buffer, len, failedP );}uint32_tSocketRead(TSocket *       const socketP,            unsigned char * const buffer,            uint32_t        const len) {        return (*socketP->vtbl.read)(socketP, buffer, len);}abyss_boolSocketConnect(TSocket * const socketP,              TIPAddr * const addrP,              uint16_t  const portNumber) {    return (*socketP->vtbl.connect)(socketP, addrP, portNumber);}abyss_boolSocketBind(TSocket * const socketP,           TIPAddr * const addrP,           uint16_t  const portNumber) {    return (*socketP->vtbl.bind)(socketP, addrP, portNumber);}abyss_boolSocketListen(TSocket * const socketP,             uint32_t  const backlog) {    return (*socketP->vtbl.listen)(socketP, backlog);}voidSocketAccept(TSocket *    const listenSocketP,             abyss_bool * const connectedP,             abyss_bool * const failedP,             TSocket **   const acceptedSocketPP,             TIPAddr *    const ipAddrP) {    (*listenSocketP->vtbl.accept)(listenSocketP,                                  connectedP,                                  failedP,                                  acceptedSocketPP,                                  ipAddrP);}uint32_tSocketWait(TSocket *  const socketP,           abyss_bool const rd,           abyss_bool const wr,           uint32_t   const timems) {    return (*socketP->vtbl.wait)(socketP, rd, wr, timems);}uint32_tSocketAvailableReadBytes(TSocket * const socketP) {    return (*socketP->vtbl.availableReadBytes)(socketP);}voidSocketGetPeerName(TSocket *    const socketP,                  TIPAddr *    const ipAddrP,                  uint16_t *   const portNumberP,                  abyss_bool * const successP) {    (*socketP->vtbl.getPeerName)(socketP, ipAddrP, portNumberP, successP);}uint32_tSocketError(TSocket * const socketP) {    return (*socketP->vtbl.error)(socketP);}

⌨️ 快捷键说明

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