跨平台C ?Socket类,?sock.cpp

跨平台C++ Socket类, sock.cpp

(2005-05-26 11:09:22)

转载▼

标签:杂谈

分类:计算机与 Internet

//---------------------------------------------------------------------------

#include

#include "sock.h"

#ifndef WIN32

#define strnicmp strncasecmp

#endif

BaseSock::BaseSock()

{

m_bUDP = false;

m_sock = -1;

m_nPort = 0;

m_bConnected = false;

}

BaseSock::~BaseSock()

{

Close();

}

SOCKETBaseSock::GetHandle()

{

return m_sock;

}

void BaseSock::Close()

{

if(m_sock!=-1)

{

#ifdef WIN32

shutdown(m_sock,SD_BOTH);

closesocket(m_sock);

#else

shutdown(m_sock, SHUT_RDWR);

close(m_sock);

#endif

m_sock=-1;

}

m_bConnected = false;

}

bool BaseSock::Create(boolbUDP)

{

m_bUDP = bUDP;

if(!m_bUDP)

m_sock = socket(AF_INET,SOCK_STREAM,0);

else

{

m_sock = socket(AF_INET,SOCK_DGRAM,0);

if(m_sock!=-1)

{

m_bConnected =  true;

}

}

return (m_sock!=-1);

}

bool BaseSock::Connect(conststring& host,unsigned short port)

{

if(m_sock==-1)

return false;

m_strHost=host;

m_nPort=port;

struct hostent *he=gethostbyname(host.c_str());

if(he==NULL)

{

Close();

return false;

}

struct sockaddr_insin;

sin.sin_family=AF_INET;

sin.sin_addr=*((struct  in_addr*)he->h_addr);

memset(sin.sin_zero,0,8);

sin.sin_port=htons(port);

if(connect(m_sock,(struct sockaddr *)&sin,sizeof(sin)))

{

Close();

return false;

}

//unsigned longrb=1;

//ioctlsocket(m_sock,FIONBIO,&rb);

int bufsize = MAX_RECV_BUFFERSIZE;

setsockopt(m_sock, SOL_SOCKET, SO_RCVBUF,(char*)&bufsize, sizeof(bufsize));

//int timeout= 20000;

//setsockopt(m_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout));

m_bConnected =  true;

return true;

}

long BaseSock::Send(const char*buf,long buflen)

{

//printf("Send:%.*s\r\n",buflen,buf);

if(m_sock==-1)

{

return-1;

}

int start=0;

int sended=0;

do

{

int len=send(m_sock,buf+sended,buflen-sended,0);

if(len

{

break;

}

sended+=len;

}while(sended

return sended;

}

long BaseSock::Recv(char*buf,long buflen)

{

if(m_sock==-1)

{

return-1;

}

fd_set fd;

FD_ZERO(&fd);

FD_SET(m_sock,&fd);

struct timeval  val= {SOCKET_TIMEOUT,0};

int selret =select(m_sock+1,&fd,NULL,NULL,&val);

if (selret

{

returnselret;

}

int len=recv(m_sock,buf,buflen,0);

//printf("Recv:%.*s\r\n",len,buf);

return len;

}

boolBaseSock::GetPeerName(string&strIP,unsigned short &nPort)

{

struct sockaddr_in addr;

memset(&addr,0,sizeof(addr));

int addrlen=sizeof(addr);

#ifdef WIN32

if(getpeername(m_sock,(structsockaddr*)&addr,&addrlen)!=0)

#else

if(getpeername(m_sock,(structsockaddr*)&addr,(socklen_t*)&addrlen)!=0)

#endif

return false;

char szIP[64];

#ifdef WIN32

sprintf(szIP,"%u.%u.%u.%u",addr.sin_addr.S_un.S_addr&0xFF,(addr.sin_addr.S_un.S_addr>>8)&0xFF,(addr.sin_addr.S_un.S_addr>>16)&0xFF,(addr.sin_addr.S_un.S_addr>>24)&0xFF);

#else

sprintf(szIP,"%u.%u.%u.%u",addr.sin_addr.s_addr&0xFF,(addr.sin_addr.s_addr>>8)&0xFF,(addr.sin_addr.s_addr>>16)&0xFF,(addr.sin_addr.s_addr>>24)&0xFF);

#endif

strIP=szIP;

nPort=ntohs(addr.sin_port);

return true;

}

boolBaseSock::isConnected()

{

return(m_sock!=-1)&&m_bConnected;

}

bool BaseSock::isUDP()

{

return m_bUDP;

}

long BaseSock::SendTo(constchar* buf,int len,const struct sockaddr_in* toaddr,int tolen)

{

if(m_sock==-1)

{

return-1;

}

return sendto(m_sock,buf,len,0,(const structsockaddr*)toaddr,tolen);

}

long BaseSock::RecvFrom(char*buf,int len,struct sockaddr_in* fromaddr,int* fromlen)

{

if(m_sock==-1)

{

return-1;

}

#ifdef WIN32

return recvfrom(m_sock,buf,len,0,(structsockaddr*)fromaddr,fromlen);

#else

return recvfrom(m_sock,buf,len,0,(structsockaddr*)fromaddr,(socklen_t*)fromlen);

#endif

}

bool BaseSock::Bind(unsignedshort nPort)

{

if(m_sock==-1)

{

return false;

}

struct sockaddr_in sin;

sin.sin_family=AF_INET;

#ifdef WIN32

sin.sin_addr.S_un.S_addr=0;

#else

sin.sin_addr.s_addr=0;

#endif

memset(sin.sin_zero,0,8);

sin.sin_port=htons(nPort);

if(bind(m_sock,(sockaddr*)&sin,sizeof(sockaddr_in))!=0)

return false;

listen(m_sock,1024);

m_bConnected = true;

return true;

}

boolBaseSock::Accept(BaseSock&client)

{

if(m_sock==-1)

{

return false;

}

client.m_sock = accept(m_sock,NULL,NULL);

client.m_bConnected = true;

return (client.m_sock != -1);

}

分享:

分享到新浪Qing

0

喜欢

阅读(606)┊评论 (0)┊收藏(0) ┊转载(0) ┊喜欢▼ ┊打印┊举报

前一篇:跨平台C++ Socket类 sock.h

后一篇:跨平台C++ Http Get和Post 函数,http.h

跨平台C++ Socket类, sock.cpp

(2005-05-26 11:09:22)

转载▼

标签:杂谈

分类:计算机与 Internet

//---------------------------------------------------------------------------

#include

#include "sock.h"

#ifndef WIN32

#define strnicmp strncasecmp

#endif

BaseSock::BaseSock()

{

m_bUDP = false;

m_sock = -1;

m_nPort = 0;

m_bConnected = false;

}

BaseSock::~BaseSock()

{

Close();

}

SOCKETBaseSock::GetHandle()

{

return m_sock;

}

void BaseSock::Close()

{

if(m_sock!=-1)

{

#ifdef WIN32

shutdown(m_sock,SD_BOTH);

closesocket(m_sock);

#else

shutdown(m_sock, SHUT_RDWR);

close(m_sock);

#endif

m_sock=-1;

}

m_bConnected = false;

}

bool BaseSock::Create(boolbUDP)

{

m_bUDP = bUDP;

if(!m_bUDP)

m_sock = socket(AF_INET,SOCK_STREAM,0);

else

{

m_sock = socket(AF_INET,SOCK_DGRAM,0);

if(m_sock!=-1)

{

m_bConnected =  true;

}

}

return (m_sock!=-1);

}

bool BaseSock::Connect(conststring& host,unsigned short port)

{

if(m_sock==-1)

return false;

m_strHost=host;

m_nPort=port;

struct hostent *he=gethostbyname(host.c_str());

if(he==NULL)

{

Close();

return false;

}

struct sockaddr_insin;

sin.sin_family=AF_INET;

sin.sin_addr=*((struct  in_addr*)he->h_addr);

memset(sin.sin_zero,0,8);

sin.sin_port=htons(port);

if(connect(m_sock,(struct sockaddr *)&sin,sizeof(sin)))

{

Close();

return false;

}

//unsigned longrb=1;

//ioctlsocket(m_sock,FIONBIO,&rb);

int bufsize = MAX_RECV_BUFFERSIZE;

setsockopt(m_sock, SOL_SOCKET, SO_RCVBUF,(char*)&bufsize, sizeof(bufsize));

//int timeout= 20000;

//setsockopt(m_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout));

m_bConnected =  true;

return true;

}

long BaseSock::Send(const char*buf,long buflen)

{

//printf("Send:%.*s\r\n",buflen,buf);

if(m_sock==-1)

{

return-1;

}

int start=0;

int sended=0;

do

{

int len=send(m_sock,buf+sended,buflen-sended,0);

if(len

{

break;

}

sended+=len;

}while(sended

return sended;

}

long BaseSock::Recv(char*buf,long buflen)

{

if(m_sock==-1)

{

return-1;

}

fd_set fd;

FD_ZERO(&fd);

FD_SET(m_sock,&fd);

struct timeval  val= {SOCKET_TIMEOUT,0};

int selret =select(m_sock+1,&fd,NULL,NULL,&val);

if (selret

{

returnselret;

}

int len=recv(m_sock,buf,buflen,0);

//printf("Recv:%.*s\r\n",len,buf);

return len;

}

boolBaseSock::GetPeerName(string&strIP,unsigned short &nPort)

{

struct sockaddr_in addr;

memset(&addr,0,sizeof(addr));

int addrlen=sizeof(addr);

#ifdef WIN32

if(getpeername(m_sock,(structsockaddr*)&addr,&addrlen)!=0)

#else

if(getpeername(m_sock,(structsockaddr*)&addr,(socklen_t*)&addrlen)!=0)

#endif

return false;

char szIP[64];

#ifdef WIN32

sprintf(szIP,"%u.%u.%u.%u",addr.sin_addr.S_un.S_addr&0xFF,(addr.sin_addr.S_un.S_addr>>8)&0xFF,(addr.sin_addr.S_un.S_addr>>16)&0xFF,(addr.sin_addr.S_un.S_addr>>24)&0xFF);

#else

sprintf(szIP,"%u.%u.%u.%u",addr.sin_addr.s_addr&0xFF,(addr.sin_addr.s_addr>>8)&0xFF,(addr.sin_addr.s_addr>>16)&0xFF,(addr.sin_addr.s_addr>>24)&0xFF);

#endif

strIP=szIP;

nPort=ntohs(addr.sin_port);

return true;

}

boolBaseSock::isConnected()

{

return(m_sock!=-1)&&m_bConnected;

}

bool BaseSock::isUDP()

{

return m_bUDP;

}

long BaseSock::SendTo(constchar* buf,int len,const struct sockaddr_in* toaddr,int tolen)

{

if(m_sock==-1)

{

return-1;

}

return sendto(m_sock,buf,len,0,(const structsockaddr*)toaddr,tolen);

}

long BaseSock::RecvFrom(char*buf,int len,struct sockaddr_in* fromaddr,int* fromlen)

{

if(m_sock==-1)

{

return-1;

}

#ifdef WIN32

return recvfrom(m_sock,buf,len,0,(structsockaddr*)fromaddr,fromlen);

#else

return recvfrom(m_sock,buf,len,0,(structsockaddr*)fromaddr,(socklen_t*)fromlen);

#endif

}

bool BaseSock::Bind(unsignedshort nPort)

{

if(m_sock==-1)

{

return false;

}

struct sockaddr_in sin;

sin.sin_family=AF_INET;

#ifdef WIN32

sin.sin_addr.S_un.S_addr=0;

#else

sin.sin_addr.s_addr=0;

#endif

memset(sin.sin_zero,0,8);

sin.sin_port=htons(nPort);

if(bind(m_sock,(sockaddr*)&sin,sizeof(sockaddr_in))!=0)

return false;

listen(m_sock,1024);

m_bConnected = true;

return true;

}

boolBaseSock::Accept(BaseSock&client)

{

if(m_sock==-1)

{

return false;

}

client.m_sock = accept(m_sock,NULL,NULL);

client.m_bConnected = true;

return (client.m_sock != -1);

}

分享:

分享到新浪Qing

0

喜欢

阅读(606)┊评论 (0)┊收藏(0) ┊转载(0) ┊喜欢▼ ┊打印┊举报

前一篇:跨平台C++ Socket类 sock.h

后一篇:跨平台C++ Http Get和Post 函数,http.h


相关内容

  • 嵌入式系统综合设计说明书
  • 嵌入式系统综合设计说明书 题 目:智能车系统-MP3播放器设计与实现 学生姓名:杜继凤 组 员:王嘉敏 杜继凤 学 院:信息工程学院 班 级:计算机11-2班 指导教师:庄旭菲 王晓强 蒋贵良 刘志强 2014 年 3 月 15 日 嵌入式项目T-CAR 智能小车是嵌入式技术和物联网技术结合的产物. ...

  • linux网络编程课程设计
  • <Linux 网络编程> 课程设计 班级: 姓名: 指导老师: 一.设计背景 Linux 操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!只要是基于GNU 公约的软件你都可以任意使用并修改它的源代码.通过这次课程设计能更好的学习网络编程知识和掌握L ...

  • C++发送邮件和附件
  • C++发送邮件和附件 头文件          /*********************************************************************** *发送邮件模块头文件 *可以发送文本和附件(支持多个附件一起发送) ********** ...

  • 2-07毕业设计(论文)初稿--左欣(2)
  • 摘 要 随着计算机通信技术和网络技术的发展,在嵌入式系统中集成以太网口,来实现与其它计算机设备之间的高速数据传输就显得更加的重要了.越来越多的计算机系统都迫切的需要和其它计算机系统进行联网,以达到共享数据,统一管理的目的.因此除了通常的使用PC机的内部网卡接入以太网外,许多的嵌入式系统也需要直接联入 ...

  • Socket网络通信
  • socket与tcp/ip编程 分类: C/C++ Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序. 要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在 ...

  • 进程间8种通信方式详解
  • 1 无名管道通信 无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 2 高级管道通信 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高 ...

  • 缓冲区溢出攻击实验
  • 栈顶和栈底信息,以及局部变量和函数的参数.上述main函数执行时,上述信息按照参数. ret(返回地址)和EBP(栈底) 的顺序依次压入其堆栈区中,然后根据所调用的局部变量再在堆栈中开辟一块相应的空间, 这个内存空间被申请占用的过程是从 内存高地址空间向低地址空间的延伸.为局部变量在堆栈中预留的空间 ...

  • 综合课程实践报告格式
  • 现代科技学院计算机专业 综合课程实践报告 题目: 学生姓名: 学 号: 专 业: 计算机科学与技术 班 级: 指导教师: 1.2班黄俊 3班李文锦 成 绩: 20011年 12 月 网络远程监控系统开发 综合课程实践报告 一.研究的背景和意义 在传统的控制方案中,操作员只有在监视工作站上才能监视到现 ...

  • 安装vsftpd+pam+mysql实现对虚拟用户身份认证功能
  • 事项说明:在这里vsftpd直接使用yum  -y  install   vsftpd来直接安装的:mysql是使用通用二进制格式安装的,使用的版本为mysql-5.5.28.这里不再介绍安装步骤,前面已经详细介绍过.由于vsftpd需要借助pam模块到mysql数据库中检索用户名和密码,在这里还需 ...