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

📄 htcpsock.h

📁 积下的一点C++编程序库源码
💻 H
字号:
// CHTcpSock.h: interface for the CHTcpSock class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_UNISOCK_H__87143DAD_9463_467C_B446_651C69D80B9E__INCLUDED_)
#define AFX_UNISOCK_H__87143DAD_9463_467C_B446_651C69D80B9E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//////////////////////////////////////////////////////////////////////////////


//文件名		: HTcpSock.h

//功能			:TCP SOCKET类,应用于Windows 和 Linux两种系统

//创建			: 2003.11.27

//修改日期		: 2004.4.9

//作者			: 韩国静
//

#include "UniSockType.h"

//////////////////////////////////////////////////////////
class CHTcpSock  
{
	UNI_DWORD	m_OppositeIp;		//对方IP
	UNI_WORD	m_OppositePort;		//对方Port
	UNI_SOCKET	m_s;				//代表与对方连接的句柄
public:

	void AddToSet(fd_set *set)
	{
		FD_SET(m_s,set);
	}
	UNI_BOOL IsInSet(fd_set *set)
	{
		return FD_ISSET(m_s,set)?UNI_TRUE:UNI_FALSE;
	}
	//用给定的IP和端口创建连接
	UNI_BOOL CreateConnect(UNI_IN UNI_DWORD ip,UNI_IN UNI_WORD port)
	{
		struct sockaddr_in name;
		Close();
		m_s=socket(AF_INET,SOCK_STREAM,UNI_IPPROTO_IP);
		if(m_s==UNI_INVALID_SOCKET)
			return UNI_FALSE;
		setsockopt(m_s,SO_BROADCAST,SOL_SOCKET,NULL,0);
		memset(&name,0,sizeof(name));
		name.sin_addr.s_addr=ip;
		name.sin_family=AF_INET;
		name.sin_port=htons(port);
		if(0==connect(m_s,(UNI_PSOCKADDR)&name,sizeof(name)))
		{
			this->m_OppositeIp=ip;
			this->m_OppositePort=port;
			return UNI_TRUE;
		}
		Close();
		return UNI_FALSE;
	};
	//
	UNI_BOOL IsOpening()
	{
		if(m_s==UNI_INVALID_SOCKET)
			return UNI_FALSE;
		return UNI_TRUE;
	};
	//网络功能反初始化,在LINUX下此函数直接返回
	static void UnInitialize()
	{
		UNI_UnInitialize();
	};
	//网络功能初始化,在LINUX下此函数直接返回
	static UNI_BOOL Initialize()
	{
		UNI_SADATA data;
		if(UNI_Initialize(&data))
			return UNI_TRUE;
		return UNI_FALSE;
	};
	//关闭SOCKET句柄
	void Close()
	{
		if(m_s!=UNI_INVALID_SOCKET)
		{
			UNI_CloseSock(m_s);
			m_s=UNI_INVALID_SOCKET;
		}
	};
	//
	UNI_DWORD GetOppoIp(){return m_OppositeIp;};
	//
	UNI_WORD  GetOppoPort(){return m_OppositePort;};
	//接收数据
	int Recv(UNI_OUT void *pOutData,UNI_IN int len)
	{
		if(pOutData!=UNI_NULL&&len>0&&m_s!=UNI_INVALID_SOCKET)
			return recv(m_s,(char*)pOutData,len,0);
		return -1;
	};
	//发送数据
	int Send(UNI_IN void *pData,UNI_IN int len)
	{
		if(pData!=UNI_NULL&&len>0&&m_s!=UNI_INVALID_SOCKET)
			return send(m_s,(char *)pData,len,0);
		return -1;
	};
	//在指定端口开始监听,nMax为最大等待连接队列长度
	UNI_BOOL ListenAt(UNI_IN UNI_WORD port,UNI_IN int nMax)
	{
		struct sockaddr_in name;
		Close();
		m_s=socket(AF_INET,SOCK_STREAM,UNI_IPPROTO_IP);
		if(m_s!=UNI_INVALID_SOCKET)
		{
			name.sin_addr.s_addr = INADDR_ANY;
			name.sin_family = AF_INET;
			name.sin_port = htons(port);
			if(SOCKET_ERROR!=bind(m_s,(UNI_PSOCKADDR)&name,sizeof(name)))
			{
				if(listen(m_s,nMax)==0)
					return UNI_TRUE;
			}
			Close();
		}
		return UNI_FALSE;
	};
	//从CHTcpSock对象接受客户端的连接请求,新接受的SOCKET保存在自身对象内
	UNI_BOOL AcceptConnect(UNI_IN CHTcpSock *Socket)
	{
		struct sockaddr_in name;
		UNI_SOCKLEN size;
		if(Socket->m_s!=UNI_INVALID_SOCKET)
		{
			size=sizeof(name);
			this->m_s=accept(Socket->m_s,(UNI_PSOCKADDR)&name,&size);
			if(m_s!=UNI_INVALID_SOCKET)
			{
				m_OppositeIp=name.sin_addr.s_addr;
				m_OppositePort=ntohs(name.sin_port);
				return UNI_TRUE;
			}
		}
		return UNI_FALSE;
	};
	UNI_DWORD GetLocal(UNI_WORD &wPort)
	{
		struct sockaddr_in name;
		UNI_SOCKLEN size=sizeof(name);
		if(0==getpeername(m_s,(UNI_PSOCKADDR)&name,&size))
		{
			wPort=ntohs(name.sin_port);
			return name.sin_addr.s_addr;
		}
		return -1;
	}
	////////////////////		构造和析构		////////////////////
	CHTcpSock(){m_s=UNI_INVALID_SOCKET;};
	virtual ~CHTcpSock(){Close();};

};

#endif // !defined(AFX_UNISOCK_H__87143DAD_9463_467C_B446_651C69D80B9E__INCLUDED_)

⌨️ 快捷键说明

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