TCP SOCKET封装类

聊天工具开发过程中,涉及到P2P技术。查阅相关资料,看网上推荐的比较好的列子hermes语音聊天系统。参考书《P2P网络技术原理与C++开发案例》。

书中简单介绍了TCP SOCKET操作的封装类,详细代码如下:

TCPSocket.h


// TCPSocket.h: interface for the CTCPSocket class.
//
//

#if !defined(_TCPSOCKET_H_)
#define _TCPSOCKET_H_

#if _MSC_VER > 1000
#pragma once
#endif

#include "winsock2.h"

class CTCPSocket  
{
public:
	static int Initialize();
	static int CleanUp();
	
	CTCPSocket();
	CTCPSocket(SOCKET s);
	virtual ~CTCPSocket();

	int Create();
	int Bind(u_short port = DEFAULT_PORT);
	int Listen(int backlog = DEFAULT_BACKLOG);
	SOCKET Accept(sockaddr* addr = NULL, int* addrlen = NULL);

	int Connect(DWORD ip, u_short port = DEFAULT_PORT);
	int Send(const char *pBuf, int len);
	int Recv(char *pbuf, int len);

	int Close();
	
	SOCKET m_socket;
private:

	sockaddr_in m_local;
	sockaddr_in m_foreign;

	enum {DEFAULT_PORT = 56177, DEFAULT_BACKLOG = 1};
};

#endif //_TCPSOCKET_H_

TCPSocket.cpp

// TCPSocket.cpp: implementation of the CTCPSocket class.
//
//

#include "stdafx.h"
#include "TCPSocket.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//
int CTCPSocket::Initialize()
{
	WSADATA wsd;
	
	return WSAStartup(MAKEWORD(2,2), &wsd);
}

int CTCPSocket::CleanUp()
{
	return WSACleanup();
}

CTCPSocket::CTCPSocket(SOCKET s)
{
	m_socket = s;
}

CTCPSocket::CTCPSocket()
{
	m_socket = INVALID_SOCKET;
}

CTCPSocket::~CTCPSocket()
{
}

int CTCPSocket::Create()
{
	m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

	return m_socket;
}

int CTCPSocket::Bind(u_short port /* = DEFAULT_PORT */)
{
	m_local.sin_addr.s_addr = htonl(INADDR_ANY);
	m_local.sin_family = AF_INET;
	m_local.sin_port = port;

	return bind(m_socket, (struct sockaddr*)&m_local, sizeof(m_local));
}

int CTCPSocket::Listen(int backlog)
{
	return listen(m_socket, backlog);
}

SOCKET CTCPSocket::Accept(sockaddr* addr /* = NULL */, int* addrlen /* = NULL */)
{
	return accept(m_socket, addr, addrlen);
}

int CTCPSocket::Connect(DWORD ip, u_short port /* = DEFAULT_PORT */)
{
	ip = htonl(ip);

	m_foreign.sin_addr.s_addr = ip;
	m_foreign.sin_family = AF_INET;
	m_foreign.sin_port = port;

	return connect(m_socket, (struct sockaddr*)&m_foreign, sizeof(m_foreign));
}

int CTCPSocket::Send(const char *pBuf, int len)
{
	return send(m_socket, pBuf, len, 0);
}

int CTCPSocket::Recv(char *pbuf, int len)
{
	return recv(m_socket, pbuf, len, 0);
}

int	 CTCPSocket::Close()
{
	int ret;

	ret = shutdown(m_socket,2);
	return closesocket(m_socket);
}


好的,以下是一个简单的TcpSocket封装示例: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <arpa/inet.h> #define MAX_BUF_SIZE 1024 class TcpSocket { private: int m_sockfd; public: TcpSocket() { m_sockfd = socket(AF_INET, SOCK_STREAM, 0); if (m_sockfd == -1) { perror("socket"); exit(EXIT_FAILURE); } } ~TcpSocket() { close(m_sockfd); } bool connect(const char* ip, int port) { struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(ip); server_addr.sin_port = htons(port); if (::connect(m_sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("connect"); return false; } return true; } bool send(const char* data, int len) { int ret = ::send(m_sockfd, data, len, 0); if (ret == -1) { perror("send"); return false; } return true; } bool recv(char* buf, int& len) { int ret = ::recv(m_sockfd, buf, MAX_BUF_SIZE, 0); if (ret == -1) { perror("recv"); return false; } len = ret; return true; } }; ``` 这个封装了常用的TCP socket操作,包括创建socket、连接服务器、发送数据、接收数据等。为了方便使用,我们在内部定义了一个私有成员变量 `m_sockfd` 作为socket的文件描述符,在的构造函数中初始化socket,析构函数中关闭socket。 在的公有成员函数中,我们实现了 `connect`、`send`、`recv` 等函数。在 `connect` 函数中,我们通过调用 `connect` 系统调用来连接服务器,如果连接失败则返回 false。在 `send` 函数中,我们通过调用 `send` 系统调用来发送数据,如果发送失败则返回 false。在 `recv` 函数中,我们通过调用 `recv` 系统调用来接收数据,如果接收失败则返回 false。 当然,这只是一个简单的示例,实际上还有很多其他的细节需要考虑,例如错误处理、数据分包、粘包处理等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值