linux socket:套接字操作的封装

本文介绍了一种简化套接字操作的封装方法,通过自定义类mySocket实现了客户端与服务器的TCP通信,包括创建、绑定、监听、接受连接、发送和接收数据等功能,适用于初学者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

套接字操作起来流程比较复杂,刚开始接触不久的话如果要实现多线程等操作会很混乱,参考了一位博主的代码进行了套接字的封装:https://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html
mySocket.h

#include <iostream>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string>
#include <netinet/in.h>
using namespace std;

const int MAXCONNECTIONS=10;
const int MAXRECEIPTIONS = 100;
class mySocket{
    public:
        int sockfd;
        struct sockaddr_in addr;
        int ip_type;
        mySocket(){
            sockfd=::socket(AF_INET,SOCK_STREAM,0);
            ip_type=AF_INET;
            if(sockfd<0){cout<<"Failed to create sock."<<endl;}
        }
        mySocket(int _domain,int _type,int _protocol){
            sockfd=::socket(_domain,_type,_protocol);
            ip_type=_domain;
            if(sockfd<0){cout<<"Failed to create sock."<<endl;}
        }
        ~mySocket(){if(isvalid())close(sockfd);cout<<"Socket has been delete"<<endl;}
        //methods for server initialization
        bool bind_addr(const string _ip,const int _port){
            //memset(&addr, 0, sizeof(addr));
            addr.sin_family=ip_type;
            addr.sin_addr.s_addr=inet_addr(_ip.c_str());
            addr.sin_port=htons(_port);
            const int on=1;
            setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//设置使bind在重启后不会出现(linux网络编程/tcp_server中server bind失败原因的)
            int bRes=bind(sockfd,(sockaddr*)&addr,sizeof(addr));
            if(bRes<0)return false;
            return true;
        }
        bool listen_fd()const{
            int lres=listen(sockfd,MAXCONNECTIONS);
            return lres<0?false:true;
        }
        bool accept_sock(mySocket& clientsock)const{
            int clientaddrLength=sizeof(clientsock.addr);
            clientsock.sockfd=::accept(sockfd,(sockaddr*)&clientsock.addr,(socklen_t*)&clientaddrLength);
            return clientsock.sockfd<0?false:true;
        }
        //method for client initialization
        bool connect_sock(const string _ip,const int _port){
            if(!isvalid())return false;
            addr.sin_family=ip_type;
            addr.sin_addr.s_addr=inet_addr(_ip.c_str());
            addr.sin_port=htons(_port);
            int cRes=connect(sockfd,(sockaddr*)&addr,sizeof(addr));
            if(cRes<0)return false;
            return true;
        }
        //data transmission
        bool send_msg(mySocket& tar,const string msg)const{
            int res=send(tar.sockfd,(char*)msg.c_str(),msg.length(),0);
            return res<0?false:true;
        }
        int receive(mySocket& source,string& msg)const{
            msg.clear();
            char buf[MAXRECEIPTIONS+1];
            int numberRead=recv(source.sockfd,buf,MAXRECEIPTIONS,0);
            if(numberRead<0){cout<<"Error in socket receiption."<<endl;return 0;}
            else if(numberRead==0)return 0;
            else{msg+=buf;return numberRead;}
        }
        bool isvalid()const{return sockfd!=-1;}
};

利用mySocket进行了客户端与服务器的通信
server.cpp

#include "mySocket.h"
int main(){
    cout<<"Server:\n";
    mySocket a,b;
    bool bRes=a.bind_addr("127.0.0.1",1233);
    a.listen_fd();
    bool aRes=a.accept_sock(b);

    if(aRes)cout<<"CONNECTED"<<endl;
    while(aRes){
        string msg="";
        int rRes=a.receive(b,msg);
        if(rRes>0){
            cout<<"Message from client:"<<msg<<endl;
            string tres="";
            for(auto i:msg){tres+=(i+1);}
            b.send_msg(b,tres);
        }
        else{break;}
    }
    cout<<endl<<"Disconnected."<<endl;
    return 0;
}

client.cpp

#include "../mySocket/mySocket.h"
int main()
{
    mySocket a;
    cout<<"client:\n";
    bool cRes=a.connect_sock("127.0.0.1",1233);
    if(cRes)cout<<"Connected"<<endl;
    while(cRes){
        string msg="";
        cout<<"Please enter:";
        getline(cin,msg);
        bool sRes=a.send_msg(a,msg);
        if(sRes){
            int rRes=a.receive(a,msg);
            if(rRes>0)
                cout<<"Message from server:"<<msg<<endl;
            else{break;}
        }
        else{break;}
    }
    cout<<endl<<"Disconnected."<<endl;
    return 0;
}
左边为客户端,右图为服务器

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值