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

📄 socket.icc

📁 发布/订阅系统中间件
💻 ICC
字号:
// -*- C++ -*-////  This file is part of Siena, a wide-area event notification system.//  See http://www.cs.colorado.edu/serl/dot/siena.html////  Author: Antonio Carzaniga <carzanig@cs.colorado.edu>//  See the file AUTHORS for full details. ////  Copyright (C) 1998-1999 University of Colorado////  This program is free software; you can redistribute it and/or//  modify it under the terms of the GNU General Public License//  as published by the Free Software Foundation; either version 2//  of the License, or (at your option) any later version.////  This program is distributed in the hope that it will be useful,//  but WITHOUT ANY WARRANTY; without even the implied warranty of//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the//  GNU General Public License for more details.////  You should have received a copy of the GNU General Public License//  along with this program; if not, write to the Free Software//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,//  USA, or send email to serl@cs.colorado.edu.////// $Id: Socket.icc,v 1.2 2002/11/22 17:52:35 carzanig Exp $//#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>inline INAddress::INAddress() {    sin_family = AF_INET;    sin_addr.s_addr = INADDR_ANY;    sin_port = htons(0);};inline INAddress::INAddress(INAddress::port_type port) {    sin_family = AF_INET;    sin_addr.s_addr = INADDR_ANY;    sin_port = htons(port);}inline INAddress::INAddress(const INAddress &a) {    sin_family = AF_INET;    sin_addr.s_addr = a.sin_addr.s_addr;    sin_port = a.sin_port;}inline INAddress::INAddress(const char * host, 			    INAddress::port_type p) {    set_host_port(host, p);}inline INAddress::size_type INAddress::size() const {    return sizeof(sockaddr_in); }inline sockaddr_in * INAddress::addr_in() {     return (sockaddr_in *)this; }inline sockaddr * INAddress::addr() {     return (sockaddr *)this; }inline const sockaddr_in * INAddress::addr_in() const {     return (sockaddr_in *)this; }inline const sockaddr * INAddress::addr() const {     return (sockaddr *)this; }inline INAddress::operator void* () {     return this;}inline INAddress::port_type INAddress::port() const {     return ntohs(sin_port); }inline INAddress::ip_address_type INAddress::host() const {     return sin_addr.s_addr; }inline const char * INAddress::hostname() const {    return inet_ntoa(sin_addr);}inline INAddress &INAddress::operator = (const INAddress &a) {    sin_port = a.sin_port;    sin_addr.s_addr  = a.sin_addr.s_addr;    return *this;}inline bool INAddress::operator < (const INAddress &x) const {    if (sin_addr.s_addr != x.sin_addr.s_addr)	return sin_addr.s_addr < x.sin_addr.s_addr;    return sin_port < x.sin_port;}inline bool INAddress::operator == (const INAddress &x) const {    return sin_addr.s_addr == x.sin_addr.s_addr && sin_port == x.sin_port;}inline SocketRep::SocketRep(): fd(-1), ref_count(0) {}inline Socket::Socket(): rep(NULL) {}inline Socket::Socket(SocketRep * r): rep(r) {    if (rep != NULL) ++rep->ref_count;}inline Socket::~Socket() {    Socket::close();}inline void Socket::assign(SocketRep *r){    if (rep != NULL && --rep->ref_count == 0) delete(rep);    rep = r;    if (rep != NULL) ++rep->ref_count;}inline void Socket::close() {    if (rep != NULL && --rep->ref_count == 0) delete(rep);    rep = NULL;}inline int Socket::filedescr() const {    return (rep != NULL) ? rep->fd : -1;    //    // should I throw an exception instead? ...design choice...    //}inline TCPSocketRep::TCPSocketRep(): SocketRep(SOCK_STREAM), buf(fd) {}inline TCPSocketRep::TCPSocketRep(int f): SocketRep(), buf(fd) {    fd = f;}inline SocketBuffer::SocketBuffer(int & f): fd(f) {    setg(gbuf, gbuf + buffer_size, gbuf + buffer_size);    setp(pbuf, pbuf + buffer_size);}inline SocketBuffer::~SocketBuffer() {    sync();}inline int SocketBuffer::pbackfail(int c) {    return EOF;}inline TCPSocket::TCPSocket(int f): iostream(NULL) {    TCPSocket::operator = (f);}inline TCPSocket & TCPSocket::operator = (const TCPSocket &s) {    Socket::assign(s.rep);    ios::init(&((TCPSocketRep *)rep)->buf);    return *this;}inline TCPSocket & TCPSocket::operator = (int f) {    TCPSocketRep * new_rep =  new TCPSocketRep(f);    Socket::assign(new_rep);    ios::init(&new_rep->buf);    return *this;}inline TCPSocket::TCPSocket(): iostream(NULL) {};inline TCPSocket::TCPSocket(const INAddress & addr)    : iostream(NULL), Socket(new TCPSocketRep()) {    ios::init(&((TCPSocketRep *)rep)->buf);    TCPSocket::connect(addr);}inline UDPSocketRep::UDPSocketRep(): SocketRep(SOCK_DGRAM) {};inline UDPSocketRep::UDPSocketRep(int f): SocketRep() { fd = f; };inline UDPSocket::UDPSocket(int f) {    UDPSocket::operator = (f);}inline UDPSocket & UDPSocket::operator = (const UDPSocket &s) {    Socket::assign(s.rep);    return *this;}inline UDPSocket & UDPSocket::operator = (int f) {    UDPSocketRep * new_rep =  new UDPSocketRep(f);    Socket::assign(new_rep);    return *this;}inline UDPSocket::UDPSocket() {};inline TCPPortRep::TCPPortRep(int f): SocketRep() { fd = f; };inline TCPPortRep::TCPPortRep(): SocketRep(SOCK_STREAM) {};inline TCPPort::TCPPort() {};inline TCPPort::TCPPort(int f) {    TCPPort::operator = (f);}inline TCPPort & TCPPort::operator = (const TCPPort & p){    Socket::assign(p.rep);    return *this;}inline TCPPort & TCPPort::operator = (int f){    Socket::assign(new TCPPortRep(f));    return *this;}inline TCPPort::TCPPort(const INAddress::port_type port, 			bool reuse, int maxconn)    : Socket(new TCPPortRep()) {    TCPPort::bind(port, reuse, maxconn);}inline int TCPPort::accept() const {    INAddress a;    return TCPPort::accept(a);}inline SocketError::SocketError(Type t, int e):     type(t), errno_value(e) {};

⌨️ 快捷键说明

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