一个封装的C++ Socket类
2011年06月03日
#include "stdafx.h"
#include "libyfun.h"
#include "mytcp.h"
//#include "ty_server.h"
//构造函数
myCTcp::myCTcp ()
{
m_timeout = 3000;
m_nSock = -1;
WSADATA sockData;
if (WSAStartup (MAKEWORD (2, 2), &sockData))
{
printf("TCP加载失败\n");
exit (0);
}
}
//析构函数
myCTcp::~myCTcp ()
{
Close ();
WSACleanup ();
}
/*赋值
入参:nSockfd - socket句柄
出参:赋值后的socket句柄
*/
int myCTcp::operator = (int nSockfd)
{
assert ((m_nSock == -1) && (nSockfd > -1));
m_nSock = nSockfd;
return m_nSock;
}
/*取出socket句柄
入参:无
出参:取出的socket句柄
*/
int myCTcp::GetHandle () const
{
return m_nSock;
}
/*创建socket
入参:无
出参:1: 成功 ; 0: 失败
*/
int myCTcp::Open ()
{
assert (m_nSock == -1);
if(m_nSock != -1)
Close ();
m_nSock = socket (AF_INET, SOCK_STREAM, 0);
setsockopt (m_nSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&m_timeout, sizeof(m_timeout));
setsockopt (m_nSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&m_timeout, sizeof(m_timeout));
return (m_nSock != -1);
}
/*关闭socket
入参:无
出参:1: 成功 ; 0: 失败
*/
int myCTcp::Close ()
{
if (m_nSock != -1)
{
if(closesocket (m_nSock) != 0)
{
int err = WSAGetLastError();
// DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "WSAGetLastError %d", err);
}
m_nSock = -1;
}
return 1;
}
/*连接
入参:pHost - IP地址或主机名
nPort - 端口
出参:1: 成功 ; 0: 失败
*/
int myCTcp::Connect (const char *pHost, int nPort) const
{
assert ((m_nSock != -1) && pHost && (nPort > 0));
struct sockaddr_in addr;
struct hostent *phe = NULL;
memset (&addr, 0, sizeof (addr));
addr.sin_family = AF_INET;
addr.sin_port = htons (nPort);
if ((addr.sin_addr.s_addr = inet_addr (pHost)) == (unsigned long int) -1)
{
if ((phe = gethostbyname (pHost)) == NULL)
return 0;
memcpy ((char *)&addr.sin_addr, phe->h_addr, phe->h_length);
}
return (connect (m_nSock, (struct sockaddr *)&addr, sizeof (addr)) == 0);
}
/*绑定
入参:pIP - IP地址
nPort - 端口
出参:1: 成功 ; 0: 失败
*/
int myCTcp::Bind (const char *pIP, int nPort) const
{
assert ((m_nSock != -1) && (nPort > 0));
struct sockaddr_in addr;
struct hostent *phe = NULL;
int opt=1;
if (setsockopt (m_nSock, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof(int)) == -1)
{
return 0;
}
memset (&addr, 0, sizeof (addr));
addr.sin_family = AF_INET;
addr.sin_port = htons (nPort);
if (!pIP)
{
addr.sin_addr.s_addr = htonl (INADDR_ANY);
}
else
{
if ((addr.sin_addr.s_addr = inet_addr (pIP)) == (unsigned long int) -1)
{
if ((phe = gethostbyname (pIP)) == NULL)
return 0;
memcpy ((char *)&addr.sin_addr, phe->h_addr, phe->h_length);
}
}
return (bind (m_nSock, (struct sockaddr *)&addr, sizeof (addr)) == 0);
}
/*监听
入参:nNum - 监听数目
出参:1: 成功 ; 0: 失败
*/
int myCTcp::Listen (int nNum) const
{
assert ((m_nSock != -1) && (nNum > 0));
return (listen (m_nSock, nNum) == 0);
}
/*接受连接
入参:无
出参:其他: 连接套接字句柄 ; -1: 失败
*/
int myCTcp::Accept () const
{
assert (m_nSock != -1);
return (accept (m_nSock, (struct sockaddr *)NULL, NULL));
}
/*发送指定数目数据
入参:pBuf - 发送缓存
nCount - 需发送字节数
nMicsec - socket超时值,单位:微妙,缺省:500000微妙
出参:实际发送字节数 ,如果发送失败,返回负数
*/
int myCTcp::Sendn (const void *pBuf, int nCount, int nMicsec) const
{
assert ((m_nSock != -1) && pBuf && (nCount > 0));
int nLeft = nCount, nWritten = 0;
const char *ptr = (const char *)pBuf;
while (nLeft > 0)
{
if ((nWritten = send (m_nSock, ptr, nLeft, 0)) socket超时值,单位:微妙,缺省:500000微妙
出参:实际接收字节数 ,如果接收失败,返回负数,如果对方关闭,返回0
*/
int myCTcp::Recvn (void *pBuf, int nCount, int nMicsec) const
{
assert ((m_nSock != -1) && pBuf && (nCount > 0));
int nLeft = nCount, nRead = 0;
char *ptr = (char *)pBuf;
while (nLeft > 0)
{
if ((nRead = recv (m_nSock, ptr, nLeft, 0)) < 0)
{
return MY_SOCK_ERROR;
}
else if (nRead == 0)
{
return 0;
}
nLeft -= nRead;
ptr += nRead;
}
return nCount;
}
/*设置地址可重用
入参:无
出参:1: 成功 ; 0: 失败
*/
int myCTcp::SetReuseAddr ()
{
assert (m_nSock != -1);
int opt = 1;
if (setsockopt (m_nSock, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof(int)) == -1)
{
return 0;
}
return 1;
}
发表评论
-
通过ACL和.net Framework实施对Windows对象访问的管理
2012-01-20 01:53 832通过ACL和.net Framework实施对Windows对 ... -
在android 2.3 AVD 模拟器上安装 google market 安卓市场
2012-01-20 01:53 666在android 2.3 AVD 模拟器上安装 google ... -
在android 2.3 AVD 模拟器上安装 google market 安卓市场
2012-01-20 01:53 789在android 2.3 AVD 模拟器上安装 google ... -
Silverlight在嵌入式平台Windows ce中的应用
2012-01-20 01:53 1171Silverlight在嵌入式平台Wi ... -
Windows Azure(四-2):云端的文件系统(Blob Storage)
2012-01-20 01:53 851Windows Azure(四-2):云端的文件系统(Blob ... -
永不放弃 never give up 我的校园
2012-01-19 09:40 649永不放弃 never give up 我 ... -
孩子们,老师现在说的,你们能懂吗
2012-01-19 09:40 512孩子们,老师现在说的, ... -
恶作剧之吻
2012-01-19 09:40 680恶作剧之吻 2012年01月14日 长大是一种忧伤的颜色 ... -
应聘教师时的常见问题2012-1-1
2012-01-19 09:39 805应聘教师时的常见问题2 ... -
【iphone】开发者传授APP开发,审核,发布流程!
2012-01-17 02:15 1789【iphone】开发者传授APP ... -
基于FLEX技术的应用架构设计及其应用
2012-01-17 02:15 753基于FLEX技术的应用架构 ... -
多线程
2012-01-17 02:15 693多线程 2011年05月15日 ... -
七雄争霸服务端详细安装说明【更新WIN系统架设教程】
2012-01-17 02:15 2103七雄争霸服务端详细安装说明【更新WIN系统架设教程】 201 ... -
利用HaRET移植android - 老知识收藏
2012-01-17 02:14 766利用HaRET移植android - 老 ... -
基于C#的Socket开发快速入门
2012-01-15 21:51 771基于C#的Socket开发快速 ... -
C++ socket编程(tcp udp)
2012-01-15 21:51 752C++ socket编程(tcp udp) 2011 ... -
C#托管Socket的实现方法
2012-01-15 21:51 715C#托管Socket的实现方法 2009年10月23日 ... -
C# Socket编程笔记
2012-01-15 21:51 542C# Socket编程笔记 2010年03月14日 看到 ...
相关推荐
类c++封装的一个socket类,对新手还是有点帮助
主要介绍了C++自定义封装socket操作业务类,结合完整实例形式分析了Linux环境下C++操作socket的封装业务类,可实现基本的socket连接、参数设置、发送请求等基本功能,需要的朋友可以参考下
真正可以使用的平台无关性的 C++ socket wrapper,没有做任何多余的事情,仅仅对 socket 的基本功能进行了平台无关性的封装,简洁原生。封装了:setoption, connect, close, send, recv, sendto, recvfrom, accept...
visual C++ 编程,封装好的Socket类,可用于广播
详细介绍了socket原理,以及如何将socket封装成C++类
C++封装类CWSocket(多线程 非阻塞)vc mfc 一般直接添加就可用,还有超时处理,强大。
封装了epoll功能,很简单的使用epoll,只需要指定epoll服务监听端口,就可以运行epoll服务。可以指定收到数据的回调函数,可以指定有连接的回调函数,可以指定网络关闭的回调函数。自己编写调试epoll模型可能要几天...
c++的socket访问http封装类,详细的注释和介绍
socket编程——c语言封装——c++封装(一对一对话).zip
把socket IOCP网络通信模型封装成c++类.zip
实现中的几个注意点: 1 Socket类几个成员函数的访问权限为protected 使Socket类可以进行继承 但不允许私自使用; 2 TCPClient类的send receive方法使用了著名的writen readn 来源UNP 实现 解决了TCP的粘包问题 3 ...
详细介绍了Linux系统下的Socket原理,并将Socket封装成了C++库,可以直接调用Socket类进行编程
跨平台的最轻量级socket的c++库,支持windows,linux,solaris-cross-platform of the most lightweight c socket library, support for Windows, Linux, Solaris
一个开源的高性能IOCP(完成端口)网络通信封装框架《HP-Socket》的使用实例,官方的DEMO只有MFC对话框的版本,对于刚接触这个框架的新手不太容易把代码移植到自己的项目。 此DEMO使用标准C++控制台来实现,对于刚...
自己封装的TCPSocket,用于自建C++编程
一个基于纯SOCKET的FTP服务器程序,C++封装的,里面使用说明和原代码,编译环境VS2013,希望对大家有帮助
用c++语言封装的csocket客户端类,将发送和接收函数都已经封装,直接调用即可
socket编程 c/c++代码,服务器和客户端都有,而且有自己封装成类。有编译完成的exe
socket封装库,有服务器和客户端,客户端和服务器集于一体,可以相互发送消息。
封装的非常完善的socket类,支持服务器客户端多个连接,调用起来非常方便