c++ 将socket使用封装成类,实现socket通信

最近简单的整理了一下socket的使用,可能存在某些问题,望指出,谢谢。

SocketConnect.h

#ifndef _SOCKETCONNECT_H_
#define _SOCKETCONNECT_H_

#include 
#include

class SocketConnet
{
public:
	SocketConnet():m_Client(INVALID_SOCKET) //将socket设置成无效套接字
	{

	}
	bool Init();
	void SettingTimeout(int timeout);
	bool Connect(char* host, unsigned short port);
	int Send(char* data, int len);
	int Read(std::string &recData);
	void Close();

private:
	SOCKET m_Client;

};

#endif


#include"SocketConnect.h"
#include 

#pragma comment(lib,"ws2_32.lib")

#define RECV_BUFFER_SIZE (32*1024)

bool SocketConnet::Init()
{
	WSADATA wsaData;
	WORD wVersionRet;            //调用版本返回值
	//初始化winsock库
	wVersionRet = MAKEWORD(2,2);
	if (WSAStartup(wVersionRet, &wsaData) != 0)//加载套接字库 以及确认socket版本
	{
		// 初始化winsock服务失败,socket错误
		return false;
	}

	// 检测是否支持2.2版本的socket
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		WSACleanup();

		// socket错误
		return false;
	}

	//创建客户端套接字
	m_Client=socket(AF_INET,SOCK_STREAM,0);//流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW)。基于TCP的socket编程是采用的流式套接字。
	//protocol:协议类型,通常是IPPROTO_TCP或IPPROTO_UDP
	if(INVALID_SOCKET == m_Client)
	{
		//释放winsock库
		WSACleanup();   
		return false;
	}

	return true;
}
void SocketConnet::SettingTimeout(int timeout)
{
	int milSecond = 0;           //超时时限(毫秒)
	milSecond = timeout * 1000;
	// 设置发送时限
	setsockopt(m_Client, SOL_SOCKET, SO_SNDTIMEO, (char*)&milSecond, sizeof(int));
	// 设置接收时限
	setsockopt(m_Client, SOL_SOCKET, SO_RCVTIMEO, (char*)&milSecond, sizeof(int));
}
bool SocketConnet::Connect(char* serverIp, unsigned short serverPort)
{
	SOCKADDR_IN    server_addr;  // 服务端socket地址

	//TCP协议
	//指明远程服务的地址信息(IP地址、端口号等)
	memset(&server_addr ,0,sizeof(SOCKADDR_IN));   //先将保存地址server置零
	server_addr.sin_family=PF_INET; //声明地址格式是TCP/IP格式
	server_addr.sin_port=htons(serverPort); //指明连接服务器的端口号,htons可用于主机序与网络序之间的转化
	server_addr.sin_addr.s_addr=inet_addr(serverIp);//指明连接服务器的IP地址,sin_addr字段也是一个结构体,
	//sin_addr.s_addr用于最终保存IP地址
	//inet_addr inet_addr()用于将 形如的"127.0.0.1"字符串转换为IP地址格式      
	//连接指明的服务器上
	int nRet=connect(m_Client,(struct sockaddr *)&server_addr,sizeof(SOCKADDR_IN));//连接后可以用sClient来使用这个连接      
	if(SOCKET_ERROR == nRet)
	{
		// 关闭连接
		closesocket(m_Client);
		// 释放winsock
		WSACleanup();
		return false;
	}
	return true;
}
int SocketConnet::Send(char* writeBuf, int len)
{
	// 向服务端发送数据
	int nRet = send(m_Client, writeBuf, len, 0);
	if (nRet <= 0)
	{
		// 无法向服务器发送数据
		nRet = -1;
		return nRet;
	}
	return 0;
}
int SocketConnet::Read(std::string &recData)
{
	// 接收服务端返回的数据
	char readBuf[RECV_BUFFER_SIZE] = {0};
	recData.clear();

	int nRet = 	recv(m_Client, readBuf, RECV_BUFFER_SIZE, 0);
	if (nRet <= 0)
	{
		// 服务器未返回数据
		nRet = -1;
		return nRet;
	}
	recData.append(readBuf,nRet);
}

void SocketConnet::Close()
{
	if( m_Client != INVALID_SOCKET )
	{
		m_Client = INVALID_SOCKET;
		// 关闭连接
		closesocket( m_Client );
		// 释放winsock
		WSACleanup();
	}
}

你可能感兴趣的:(c++笔记,c++,socket)