/*---------------------------------------------------------------------------*/
/* */
/* CSimpleSocket.cpp - CSimpleSocket Implementation */
/* */
/* Author : Mark Carrier (mark@carrierlabs.com) */
/* */
/*---------------------------------------------------------------------------*/
/* Copyright (c) 2007-2009 CarrierLabs, LLC. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* 4. The name "CarrierLabs" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* mark@carrierlabs.com.
*
* THIS SOFTWARE IS PROVIDED BY MARK CARRIER ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MARK CARRIER OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*----------------------------------------------------------------------------*/
#include "SimpleSocket.h"
CSimpleSocket::CSimpleSocket(CSocketType nType) :
m_socket(INVALID_SOCKET),
m_socketErrno(CSimpleSocket::SocketInvalidSocket),
m_pBuffer(NULL), m_nBufferSize(0), m_nSocketDomain(AF_INET),
m_nSocketType(SocketTypeInvalid), m_nBytesReceived(-1),
m_nBytesSent(-1), m_nFlags(0),
m_bIsBlocking(true)
{
SetConnectTimeout(1, 0);
memset(&m_stRecvTimeout, 0, sizeof(struct timeval));
memset(&m_stSendTimeout, 0, sizeof(struct timeval));
memset(&m_stLinger, 0, sizeof(struct linger));
switch(nType)
{
//----------------------------------------------------------------------
// Declare socket type stream - TCP
//----------------------------------------------------------------------
case CSimpleSocket::SocketTypeTcp:
{
m_nSocketDomain = AF_INET;
m_nSocketType = CSimpleSocket::SocketTypeTcp;
break;
}
case CSimpleSocket::SocketTypeTcp6:
{
m_nSocketDomain = AF_INET6;
m_nSocketType = CSimpleSocket::SocketTypeTcp6;
break;
}
//----------------------------------------------------------------------
// Declare socket type datagram - UDP
//----------------------------------------------------------------------
case CSimpleSocket::SocketTypeUdp:
{
m_nSocketDomain = AF_INET;
m_nSocketType = CSimpleSocket::SocketTypeUdp;
break;
}
case CSimpleSocket::SocketTypeUdp6:
{
m_nSocketDomain = AF_INET6;
m_nSocketType = CSimpleSocket::SocketTypeUdp6;
break;
}
//----------------------------------------------------------------------
// Declare socket type raw Ethernet - Ethernet
//----------------------------------------------------------------------
case CSimpleSocket::SocketTypeRaw:
{
#if defined(_LINUX) && !defined(_DARWIN)
m_nSocketDomain = AF_PACKET;
m_nSocketType = CSimpleSocket::SocketTypeRaw;
#endif
#ifdef _WIN32
m_nSocketType = CSimpleSocket::SocketTypeInvalid;
#endif
break;
}
default:
m_nSocketType = CSimpleSocket::SocketTypeInvalid;
break;
}
}
CSimpleSocket::CSimpleSocket(CSimpleSocket &socket)
{
m_pBuffer = new uint8[socket.m_nBufferSize];
m_nBufferSize = socket.m_nBufferSize;
memcpy(m_pBuffer, socket.m_pBuffer, socket.m_nBufferSize);
}
CSimpleSocket *CSimpleSocket::operator=(CSimpleSocket &socket)
{
if (m_nBufferSize != socket.m_nBufferSize)
{
delete m_pBuffer;
m_pBuffer = new uint8[socket.m_nBufferSize];
m_nBufferSize = socket.m_nBufferSize;
memcpy(m_pBuffer, socket.m_pBuffer, socket.m_nBufferSize);
}
return this;
}
//------------------------------------------------------------------------------
//
// Initialize() - Initialize socket class
//
//------------------------------------------------------------------------------
bool CSimpleSocket::Initialize()
{
errno = CSimpleSocket::SocketSuccess;
#ifdef WIN32
//-------------------------------------------------------------------------
// Data structure containing general Windows Sockets Info
//-------------------------------------------------------------------------
memset(&m_hWSAData, 0, sizeof(m_hWSAData));
WSAStartup(MAKEWORD(2, 0), &m_hWSAData);
#endif
//-------------------------------------------------------------------------
// Create the basic Socket Handle
//-------------------------------------------------------------------------
m_timer.Initialize();
m_timer.SetStartTime();
m_socket = socket(m_nSocketDomain, m_nSocketType, 0);
m_timer.SetEndTime();
TranslateSocketError();
return (IsSocketValid());
}
//------------------------------------------------------------------------------
//
// BindInterface()
//
//------------------------------------------------------------------------------
bool CSimpleSocket::BindInterface(const char *pInterface)
{
bool bRetVal = false;
struct in_addr stInterfaceAddr;
if (GetMulticast() == true)
{
if (pInterface)
{
stInterfaceAddr.s_addr= inet_addr(pInterface);
if (SETSOCKOPT(m_socket, IPPROTO_IP, IP_MULTICAST_IF, &stInterfaceAddr, sizeof(stInterfaceAddr)) == SocketSuccess)
{
bRetVal = true;
}
}
}
else
{
SetSocketError(CSimpleSocket::SocketProtocolError);
}
return bRetVal;
}
//------------------------------------------------------------------------------
//
// SetMulticast()
//
//------------------------------------------------------------------------------
bool CSimpleSocket::SetMulticast(bool bEnable, uint8 multicastTTL)
{
bool bRetVal = false;
if (GetSocketType() == CSimpleSocket::SocketTypeUdp)
{
m_bIsMulticast = bEnable;
if (SETSOCKOPT(m_socket, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&multicastTTL, sizeof(multicastTTL)) == SocketError)
{
TranslateSocketError();
bRetVal = false;
}
else
{
bRetVal = true;
}
}
else
{
m_socketErrno = CSimpleSocket::SocketProtocolError;
}
return bRetVal;
}
//------------------------------------------------------------------------------
//
// SetSocketDscp()
//
//------------------------------------------------------------------------------
bool CSimpleSocket::SetSocketDscp(int32 nDscp)
{
bool bRetVal = true;
int32 nTempVal = nDscp;
nTempVal <<= 4;
nTempVal /= 4;
if (IsSocketVal
没有合适的资源?快使用搜索试试~ 我知道了~
跨平台tcp socket 客户端服务端(C++源码)
共11个文件
cpp:6个
h:5个
需积分: 50 100 下载量 54 浏览量
2018-11-22
15:35:42
上传
评论 6
收藏 28KB RAR 举报
温馨提示
跨平台C++ tcp socket 客户端服务端源码 适用于linux window mac系统
资源推荐
资源详情
资源评论
收起资源包目录
socket-master.rar (11个子文件)
socket-master
src
SimpleSocket.h 26KB
PassiveSocket.cpp 11KB
Host.h 9KB
PassiveSocket.h 7KB
SimpleSocket.cpp 36KB
ActiveSocket.cpp 10KB
StatTimer.h 4KB
ActiveSocket.h 4KB
examples
QueryDayTime.cpp 2KB
RecvAsync.cpp 2KB
EchoServer.cpp 1KB
共 11 条
- 1
资源评论
踏雪飞鸿_Python
- 粉丝: 18
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功