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

📄 socket.cpp

📁 rcssserver3d Robocup 3D比赛官方指定平台
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************               socket.cpp  -  Base newtork socket class                             -------------------    begin                : 08-JAN-2003    copyright            : (C) 2003 by The RoboCup Soccer Server                           Maintenance Group.    email                : sserver-admin@lists.sourceforge.net ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU LGPL as published by the Free Software  * *   Foundation; either version 2 of the License, or (at your option) any  * *   later version.                                                        * *                                                                         * ***************************************************************************/#include "socket.hpp"#if HAVE_CONFIG_H#include <sparkconfig.h>#endif#include <sys/types.h>#ifdef HAVE_SYS_SOCKET_H#include <sys/socket.h>#endif#ifdef HAVE_NETINET_IN_H#include <netinet/in.h>#endif#ifdef HAVE_ARPA_INET_H#include <arpa/inet.h>#endif#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <fcntl.h>#include <cerrno>#if defined (HAVE_POLL_H)#include <poll.h>#endif#ifndef HAVE_SOCKLEN_Ttypedef int socklen_t;#endif#ifdef HAVE_WINSOCK2_H#include "Winsock2.h"#endif#include "handler.hpp"#include "tcpsocket.hpp"#include <iostream>namespace rcss{    namespace net    {#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(CYGWIN)                const Socket::SocketDesc Socket::INVALIDSOCKET = INVALID_SOCKET;#else                const Socket::SocketDesc Socket::INVALIDSOCKET = -1;#endif        void        Socket::closeFD( SocketDesc* s )        {#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)            ::closesocket( *s );#else            ::close( *s );#endif            delete s;        }        Socket::Socket()                        : m_handler( &Handler::instance() )        {}        Socket::Socket( SocketDesc s )                        : m_handler( &Handler::instance() )        {            m_handle = boost::shared_ptr< SocketDesc >( new SocketDesc( s ),                                                        Socket::closeFD );        }        Socket::~Socket()        { close(); }        bool        Socket::open()        {            SocketDesc s;            if( !doOpen( s ) )                return false;            m_handle = boost::shared_ptr< SocketDesc >( new SocketDesc( s ),                                                        Socket::closeFD );#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)            int err = setCloseOnExec();            if( err < 0 )            {                err = errno;                close();                return false;            }#endif            return true;        }        bool        Socket::bind( const Addr& addr )        {            if( isOpen() )            {                int err = ::bind( getFD(),                                  (struct sockaddr *)&( addr.getAddr() ),                                  sizeof( addr.getAddr() ) );#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)                if( err == SOCKET_ERROR )                    return false;#else                if( err < 0 )                    return false;#endif                return true;            }            return false;        }        Addr        Socket::getName() const        {            if( isOpen() )            {                Addr::AddrType name;                socklen_t from_len = sizeof( name );                int err = ::getsockname( getFD(),                                         (struct sockaddr *)&name,                                         &from_len );#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(CYGWIN)                if( err == SOCKET_ERROR )                {                    err = WSAGetLastError();                    return Addr();                }#else                if( err < 0 )                    return Addr();#endif                return Addr( name );            }            else                return Addr();        }        bool        Socket::connect( const Addr& addr )        {            if( isOpen() )            {                int err = ::connect( getFD(),                                     (const struct sockaddr *)&( addr.getAddr() ),                                     sizeof( addr.getAddr() ) );#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(CYGWIN)                if( err == SOCKET_ERROR )                    return false;#else                if( err < 0 )                    return false;#endif                return true;            }            else                return false;        }        Addr        Socket::getPeer() const        {            if( isOpen() )            {                Addr::AddrType name;                socklen_t from_len = sizeof( name );                int err = ::getpeername( getFD(),                                         (struct sockaddr *)&name,                                         &from_len );#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(CYGWIN)                if( err == SOCKET_ERROR )                {                    return Addr();                }#else                if( err < 0 )                    return Addr();#endif                return Addr( name );            }            else                return Addr();        }        void        Socket::close()        {            m_handle.reset();        }        int        Socket::setCloseOnExec( bool on )        {            if( isOpen() )            {#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)                errno = EPERM;                return -1;#else                return fcntl( getFD(), F_SETFD,                              ( on ? FD_CLOEXEC : ~FD_CLOEXEC ) );#endif            }            else            {                errno = EPERM;                return -1;            }        }        int        Socket::setNonBlocking( bool on )        {            if( isOpen() )            {#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)                u_long tmp = on;                return ioctlsocket( getFD(), FIONBIO, &tmp );#else                int flags = fcntl( getFD(), F_GETFL, 0 );                if( flags == -1 )                    return flags;                if( on )                    return fcntl( getFD(), F_SETFL,                                  O_NONBLOCK | flags );                else                    return fcntl( getFD(), F_SETFL,                                  ~O_NONBLOCK & flags );#endif            }            else            {                errno = EPERM;                return -1;            }        }        int        Socket::setAsync( bool on )        {#ifdef O_ASYNC            if( isOpen() )            {                int flags = fcntl( getFD(), F_GETFL, 0 );                if ( on )                    return fcntl ( getFD(), F_SETFL,                                   O_ASYNC | flags );                else                    return fcntl ( getFD(), F_SETFL,                                   ~O_ASYNC & flags );            }#endif            errno = EPERM;            return -1;        }        int        Socket::setBroadcast( bool on )        {#ifdef SO_BROADCAST            if( isOpen() )            {                int ison = on;                return setsockopt( getFD(), SOL_SOCKET,                                   SO_BROADCAST,#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)                                   (const char*)&ison,#else                                   (void*)&ison,

⌨️ 快捷键说明

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