首页 > 编程语言 >C++风格socket

C++风格socket

时间:2024-08-30 23:03:52浏览次数:11  
标签:socket int C++ Socket serverSocket 风格 SimpleSocket clientSocket size

创建 socket、绑定、监听、接受连接和发送/接收数据等功能。用于在服务端创建一个 Socket 并接受客户端连接。

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

class SimpleSocket {
public:
    SimpleSocket(int domain, int service, int protocol, int port, u_long interface);
    int acceptConnection();
    ssize_t sendData(int clientSocket, const char* data, size_t size);
    ssize_t receiveData(int clientSocket, char* buffer, size_t size);
    ~SimpleSocket();

private:
    int serverSocket;
    struct sockaddr_in address;
    int addrlen;
};

SimpleSocket::SimpleSocket(int domain, int service, int protocol, int port, u_long interface) {
    // 创建 Socket
    serverSocket = socket(domain, service, protocol);
    if (serverSocket == 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 配置 Socket 地址结构
    address.sin_family = domain;
    address.sin_port = htons(port);
    address.sin_addr.s_addr = interface;

    // 绑定 Socket
    if (bind(serverSocket, (struct sockaddr*)&address, sizeof(address)) < 0) {
        perror("Socket bind failed");
        close(serverSocket);
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(serverSocket, 3) < 0) {
        perror("Socket listen failed");
        close(serverSocket);
        exit(EXIT_FAILURE);
    }

    addrlen = sizeof(address);
}

int SimpleSocket::acceptConnection() {
    int clientSocket = accept(serverSocket, (struct sockaddr*)&address, (socklen_t*)&addrlen);
    if (clientSocket < 0) {
        perror("Accept failed");
        close(serverSocket);
        exit(EXIT_FAILURE);
    }
    return clientSocket;
}

ssize_t SimpleSocket::sendData(int clientSocket, const char* data, size_t size) {
    return send(clientSocket, data, size, 0);
}

ssize_t SimpleSocket::receiveData(int clientSocket, char* buffer, size_t size) {
    return recv(clientSocket, buffer, size, 0);
}

SimpleSocket::~SimpleSocket() {
    close(serverSocket);
}

int main() {
    // 创建一个服务端 Socket 对象,监听端口 8080
    SimpleSocket server(AF_INET, SOCK_STREAM, 0, 8080, INADDR_ANY);

    std::cout << "Server is listening on port 8080..." << std::endl;

    int clientSocket = server.acceptConnection();
    std::cout << "Client connected!" << std::endl;

    // 发送和接收数据
    const char* message = "Hello from server";
    server.sendData(clientSocket, message, strlen(message));

    char buffer[1024] = {0};
    server.receiveData(clientSocket, buffer, 1024);
    std::cout << "Message from client: " << buffer << std::endl;

    close(clientSocket);

    return 0;
}

标签:socket,int,C++,Socket,serverSocket,风格,SimpleSocket,clientSocket,size
From: https://www.cnblogs.com/muko-aoi/p/18389649

相关文章

  • C++ 135类和对象_面像对像_多态
    135类和对象_面像对像_多态学习内容 1.抽象类 2.虚函数 3.纯虚函数动态多态满足条件1.有继承关系2.子类重写父类函数3.用父类的函数指针指向子类的对象AnimalBaseModel&animal代码#include<iostream>usingnamespacestd;//cout在这里,没有它会报错#includ......
  • socket
    socket()函数是用于创建套接字(Socket)的基础系统调用之一。套接字是网络通信的基本结构,用于在不同主机之间进行数据传输。socket()函数返回一个文件描述符(filedescriptor),这个描述符代表了新创建的套接字。函数原型cpp复制代码intsocket(intdomain,inttype,intprotocol......
  • 用c++以数组的形式实现栈的数据结构
    #include<iostream>usingnamespacestd;//设置数组的最大值#define MaxSize100intA[MaxSize];//栈顶inttop=-1;//入栈voidpush(intx){  //处理溢出的情况  if(top==MaxSize-1){    cout<<"stackoverflow"<<endl;    return; ......
  • 【C++ Primer Plus习题】7.7
    问题:解答:#include<iostream>usingnamespacestd;#defineSIZE10double*fill_array(double*begin,double*end){ for(begin;begin<end;begin++) { cout<<"请输入值:"; cin>>*begin; if(cin.fail()) { co......
  • 【C++ Primer Plus习题】7.6
    问题:解答:#include<iostream>usingnamespacestd;#defineSIZE20intFill_array(double*arr,intlen){ inti=0; for(i=0;i<len;i++) { cout<<"请输入值:"; cin>>arr[i]; if(cin.fail()) { cout<&......
  • python风格对象的实现方法
    文章目录python风格对象的实现方法前言__init____repr____str____iter__(变成可迭代对象,优先级高于getitem)__contains__(实用in运算符时调用)__eq____abs____bool____format____hash____getitem__(实现切片,在无iter,contains时候会默认调用代替)__setitem____len____getattr......
  • C++ 嵌套类简单测试
    classDog{public:classAnimal{public:Animal(Dog*dog){m_Dog=dog;m_Age=1;m_Name=dog->m_Info;//可以访问宿主类对象}stringm_Name;intgetAge(){......
  • OpenVoiceV2:零样本跨语言语音克隆技术,支持多种风格控制
    1openvoicev2介绍语音克隆技术近年来取得了显著进展,但现有方法通常存在着局限性,例如无法灵活控制语音风格、需要大量多语言数据进行训练、生成速度慢等等。为了克服这些挑战,MyShell.ai团队推出了全新的语音克隆技术OpenVoiceV2,它能够在无需额外训练的情况下,仅凭少量参考音频......
  • C++小助手1.0.1
    注:只能在C++6.7.5运行小助手代码:#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;//显示带有动画效果的文本voidccc(strings){ for(charc:s){ cout<<c; Sleep(50); } cout<<endl;}//加密字符串(简单的移......
  • Unity+QT, 如何把Unity打包出的exe嵌入QT程序中,并且使用Socket进行交互
    文章目录概要前期准备QT与Unity的Socket通信实际应用场景总结概要在VR开发中,常常需要桌面窗口和VR头盔使用者进行交互。通过将Unity制作的VR程序嵌入到QT应用程序窗口中,并使用Socket进行通信,可以实现这种交互。本文将介绍如何实现这一功能。前期准......