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

📄 socket.cpp

📁 在linux使用c++开发的socke程序
💻 CPP
字号:
// Implementation of the Socket class.#include "Socket.h"#include "string.h"#include <string.h>#include <errno.h>#include <fcntl.h>Socket::Socket() :  m_sock ( -1 ){  memset ( &m_addr,	   0,	   sizeof ( m_addr ) );}Socket::~Socket(){  if ( is_valid() )    ::close ( m_sock );}bool Socket::create(){  m_sock = socket ( AF_INET,		    SOCK_STREAM,		    0 );  if ( ! is_valid() )    return false;  // TIME_WAIT - argh  int on = 1;  if ( setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* ) &on, sizeof ( on ) ) == -1 )    return false;  return true;}bool Socket::bind ( const int port ){  if ( ! is_valid() )    {      return false;    }  m_addr.sin_family = AF_INET;  m_addr.sin_addr.s_addr = INADDR_ANY;  m_addr.sin_port = htons ( port );  int bind_return = ::bind ( m_sock,			     ( struct sockaddr * ) &m_addr,			     sizeof ( m_addr ) );  if ( bind_return == -1 )    {      return false;    }  return true;}bool Socket::listen() const{  if ( ! is_valid() )    {      return false;    }  int listen_return = ::listen ( m_sock, MAXCONNECTIONS );  if ( listen_return == -1 )    {      return false;    }  return true;}bool Socket::accept ( Socket& new_socket ) const{  int addr_length = sizeof ( m_addr );  new_socket.m_sock = ::accept ( m_sock, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length );  if ( new_socket.m_sock <= 0 )    return false;  else    return true;}bool Socket::send ( const std::string s ) const{  int status = ::send ( m_sock, s.c_str(), s.size(), MSG_NOSIGNAL );  if ( status == -1 )    {      return false;    }  else    {      return true;    }}int Socket::recv ( std::string& s ) const{  char buf [ MAXRECV + 1 ];  s = "";  memset ( buf, 0, MAXRECV + 1 );  int status = ::recv ( m_sock, buf, MAXRECV, 0 );  if ( status == -1 )    {      std::cout << "status == -1   errno == " << errno << "  in Socket::recv\n";      return 0;    }  else if ( status == 0 )    {      return 0;    }  else    {      s = buf;      return status;    }}bool Socket::connect ( const std::string host, const int port ){  if ( ! is_valid() ) return false;  m_addr.sin_family = AF_INET;  m_addr.sin_port = htons ( port );  int status = inet_pton ( AF_INET, host.c_str(), &m_addr.sin_addr );  if ( errno == EAFNOSUPPORT ) return false;  status = ::connect ( m_sock, ( sockaddr * ) &m_addr, sizeof ( m_addr ) );  if ( status == 0 )    return true;  else    return false;}void Socket::set_non_blocking ( const bool b ){  int opts;  opts = fcntl ( m_sock,		 F_GETFL );  if ( opts < 0 )    {      return;    }  if ( b )    opts = ( opts | O_NONBLOCK );  else    opts = ( opts & ~O_NONBLOCK );  fcntl ( m_sock,	  F_SETFL,opts );}

⌨️ 快捷键说明

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