Socket封装

socket.h

//

#ifndef SOCK_SOCKET_H_
#define SOCK_SOCKET_H_


// #include <standard library headers>
#include <string>

// #include <other library headers>
#ifdef _WIN32
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <memory.h>
#include <arpa/inet.h>
#endif

// #include "customer headers"


#ifdef _WIN32
typedef int socklen_t;
#else
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
typedef int SOCKET;
#endif


namespace sock
{

    const int MAXSEND = 1000;
    const int MAXRECV = 1000;

    class Socket
    {
    public:
        Socket(int type = SOCK_STREAM);
        virtual ~Socket();

    public:
        // Server initialization
        bool Bind(int port);
        bool Listen();
        bool Accept(Socket& ns);

        // Client initialization
        bool Connect(const std::string& host, int port);
        bool Reconnect();

        int SelectRead(long sec = -1, long usec = -1);
        int SelectWrite(long sec = -1, long usec = -1);

        // TCP
        bool Send(const std::string& s);
        bool Send(const char* buf, int len);
        int Recv(std::string& s);
        int Recv(char* buf, int len);

        // UDP
        bool SendTo(const std::string& s, const std::string& host, int port);
        bool SendTo(const char* buf, int len, const std::string& host,
                    int port);
        int RecvFrom(std::string& s, std::string& host, int& port);
        int RecvFrom(char* buf, int len, std::string& host, int& port);

        void SetNonBlocking(const bool b);
        bool IsValid() const;

        const sockaddr_in& GetSocketAddr() const { return mAddr; }
        std::string GetIp() const { return inet_ntoa(mAddr.sin_addr); }
        u_short GetPort() const { return ntohs(mAddr.sin_port); }

    private:
        bool Create(int type);
        void Close();
        int Select(int type, long sec, long usec);

        static void PrintError();
        static bool MakeSockaddr(sockaddr_in* addr, const std::string& host,
                                 int port);
        static bool ParseSockAddr(const sockaddr_in& addr, std::string& host,
                                  int& port);

    private:
        Socket(const Socket& sock);
        Socket& operator = (const Socket& sock);

    private:
        SOCKET mSock;
        sockaddr_in mAddr;
        std::string mHost;
        int mPort;

    }; // end of class Socket

}


#endif // SOCK_SOCKET_H_

//

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值