c++实现封装socket

编程实例:

CSocket.h

#include <iostream>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <netdb.h>
#include <stdio.h>
#include <netinet/tcp.h>

class CServSocket
{
public:
    CServSocket();
    virtual ~CServSocket();
	std::string  getLocalAddr();
	std::string getCliAddr();
	int getAcceptSock();
	bool Accept();
    bool Listen(int port);
	bool Send(char* sendbuf, int len);
	bool Recv(char* recvbuf, int len, int timeout);
private:
	bool Close();
	bool setSoLinger(bool dolinger, int seconds);
	bool setIntOptions(int option, int value);
	bool setTimeout(int option, int milliseconds);
	bool setNonBlock(bool isnonsocket);
	bool setNoDelay(bool nodelay);
private:
    char ip[20];
	int port;
	int sockfd;
	int connsockfd;
	struct sockaddr_in servAddr, cliAddr;
};

CServSocket::CServSocket():port(0),sockfd(-1),connsockfd(-1)
{
	memset(ip, 0, 20);
}

CServSocket::~CServSocket()
{
	if(!Close())
	{
		std::cout << "close err\n";
	}
}

bool CServSocket::Close()
{
	if(sockfd)
		close(sockfd);
	else
		return false;
	if(connsockfd)
	    close(connsockfd);
	else
		return false;
	sockfd = connsockfd = port = -1;
	return true;
}

bool CServSocket::Listen(int port)
{
	if(port < 0)
	{
		std::cout <<"the port err\n";
		return false;
	}
	sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0)
	{
		std::cout << "create socket err\n";
		return false;
	}
	getLocalAddr();
	servAddr.sin_family = AF_INET;
	if(ip)
	    servAddr.sin_addr.s_addr = inet_addr(ip);
	else
		servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servA
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++封装Socket类是一种常见的做法,用于简化网络编程操作。下面是一个简单的示例: ```cpp #include <iostream> #include <string> #include <WinSock2.h> // Windows平台下的socket库 #pragma comment(lib, "ws2_32.lib") // 链接到ws2_32.lib库 class Socket { public: Socket() { // 初始化WinSock库 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "Failed to initialize WinSock" << std::endl; throw; } // 创建套接字 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { std::cerr << "Failed to create socket" << std::endl; WSACleanup(); // 清理WinSock库 throw; } } ~Socket() { closesocket(sock); // 关闭套接字 WSACleanup(); // 清理WinSock库 } // 连接到服务器 bool connectToServer(const std::string& ipAddress, int port) { serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); if (inet_pton(AF_INET, ipAddress.c_str(), &(serverAddr.sin_addr)) <= 0) { std::cerr << "Invalid address/Address not supported" << std::endl; return false; } if (connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { std::cerr << "Connection failed" << std::endl; return false; } return true; } // 发送数据 bool sendData(const std::string& data) { if (send(sock, data.c_str(), data.length(), 0) < 0) { std::cerr << "Failed to send data" << std::endl; return false; } return true; } // 接收数据 std::string receiveData() { char buffer[4096]; memset(buffer, 0, sizeof(buffer)); std::string receivedData; while (true) { int bytesRead = recv(sock, buffer, sizeof(buffer) - 1, 0); if (bytesRead <= 0) break; receivedData += buffer; memset(buffer, 0, sizeof(buffer)); } return receivedData; } private: SOCKET sock; WSADATA wsaData; struct sockaddr_in serverAddr; }; int main() { Socket socket; // 连接到服务器 if (socket.connectToServer("127.0.0.1", 8080)) { std::cout << "Connected to server" << std::endl; // 发送数据 std::string data = "Hello, server!"; if (socket.sendData(data)) { std::cout << "Data sent: " << data << std::endl; // 接收数据 std::string receivedData = socket.receiveData(); std::cout << "Received data: " << receivedData << std::endl; } } return 0; } ``` 这是一个简单的封装Socket类的例子,它实现了连接到服务器、发送数据和接收数据的功能。请注意,这个示例是基于Windows平台使用WinSock库的,如果你使用的是其他平台,需要使用相应的socket库进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值