Windows 下的最简单的TCP服务器客户端

他们是短连接的,服务器接受客户端之后,马上发送一个消息,发送完以后立即将客户端断开掉,然后继续等待下一个连接.


使用Winsocket2必须要引用到的头文件和需要包含到的链接库文件:

Windows 下的最简单的TCP服务器客户端#include <WinSock2.h>
Windows 下的最简单的TCP服务器客户端#pragma comment( lib, "ws2_32.lib" )



以下代码是Winsocket2的系统初始化和关闭的封装代码.

Windows 下的最简单的TCP服务器客户端class WinSocketSystem
Windows 下的最简单的TCP服务器客户端{
Windows 下的最简单的TCP服务器客户端public:
Windows 下的最简单的TCP服务器客户端    WinSocketSystem()
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        int iResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
Windows 下的最简单的TCP服务器客户端        if (iResult != NO_ERROR)
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            exit(-1);
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端    ~WinSocketSystem()
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        WSACleanup();
Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端protected:
Windows 下的最简单的TCP服务器客户端    WSADATA wsaData;
Windows 下的最简单的TCP服务器客户端}
;
Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端static WinSocketSystem g_winsocketsystem;


服务器端代码:
Windows 下的最简单的TCP服务器客户端class TCPServer
Windows 下的最简单的TCP服务器客户端{
Windows 下的最简单的TCP服务器客户端public:
Windows 下的最简单的TCP服务器客户端    TCPServer()
Windows 下的最简单的TCP服务器客户端        : mServerSocket(INVALID_SOCKET)
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        // 创建套接字
Windows 下的最简单的TCP服务器客户端
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
Windows 下的最简单的TCP服务器客户端        if (mServerSocket == INVALID_SOCKET)
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            std::cout << "创建套接字失败!" << std::endl;
Windows 下的最简单的TCP服务器客户端            return;
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端        // 填充服务器的IP和端口号
Windows 下的最简单的TCP服务器客户端
        mServerAddr.sin_family        = AF_INET;
Windows 下的最简单的TCP服务器客户端        mServerAddr.sin_addr.s_addr    = INADDR_ANY;
Windows 下的最简单的TCP服务器客户端        mServerAddr.sin_port        = htons((u_short)SERVER_PORT);
Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端        // 绑定IP和端口
Windows 下的最简单的TCP服务器客户端
        if ( ::bind(mServerSocket, (sockaddr*)&mServerAddr, sizeof(mServerAddr)) == SOCKET_ERROR)
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            std::cout << "绑定IP和端口失败!" << std::endl;
Windows 下的最简单的TCP服务器客户端            return;
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端        // 监听客户端请求,最大同时连接数设置为10.
Windows 下的最简单的TCP服务器客户端
        if ( ::listen(mServerSocket, SOMAXCONN) == SOCKET_ERROR)
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            std::cout << "监听端口失败!" << std::endl;
Windows 下的最简单的TCP服务器客户端            return;
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端        std::cout << "启动TCP服务器成功!" << std::endl;
Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端    ~TCPServer()
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        ::closesocket(mServerSocket);
Windows 下的最简单的TCP服务器客户端        std::cout << "关闭TCP服务器成功!" << std::endl;
Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端    void run()
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        int nAcceptAddrLen = sizeof(mAcceptAddr);
Windows 下的最简单的TCP服务器客户端        for (;;)
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            // 以阻塞方式,等待接收客户端连接
Windows 下的最简单的TCP服务器客户端
            mAcceptSocket = ::accept(mServerSocket, (struct sockaddr*)&mAcceptAddr, &nAcceptAddrLen);
Windows 下的最简单的TCP服务器客户端            std::cout << "接受客户端IP:" << inet_ntoa(mAcceptAddr.sin_addr) << std::endl;
Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端            // 发送消息
Windows 下的最简单的TCP服务器客户端
            int ret = ::send(mAcceptSocket, SEND_STRING, (int)strlen(SEND_STRING), 0);
Windows 下的最简单的TCP服务器客户端            if (ret != 0)
Windows 下的最简单的TCP服务器客户端            {
Windows 下的最简单的TCP服务器客户端                std::cout << "发送消息成功!" << std::endl;
Windows 下的最简单的TCP服务器客户端            }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端            // 关闭客户端套接字
Windows 下的最简单的TCP服务器客户端
            ::closesocket(mAcceptSocket);
Windows 下的最简单的TCP服务器客户端            std::cout << "断开客户端端成功!" << std::endl;
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端private:
Windows 下的最简单的TCP服务器客户端    SOCKET        mServerSocket;    ///< 服务器套接字句柄
Windows 下的最简单的TCP服务器客户端
    sockaddr_in    mServerAddr;    ///< 服务器地址
Windows 下的最简单的TCP服务器客户端

Windows 下的最简单的TCP服务器客户端    SOCKET        mAcceptSocket;    ///< 接受的客户端套接字句柄
Windows 下的最简单的TCP服务器客户端
    sockaddr_in    mAcceptAddr;    ///< 接收的客户端地址
Windows 下的最简单的TCP服务器客户端
};

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端int _tmain(int argc, _TCHAR* argv[])
Windows 下的最简单的TCP服务器客户端{
Windows 下的最简单的TCP服务器客户端    TCPServer server;
Windows 下的最简单的TCP服务器客户端    server.run();
Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端    return 0;
Windows 下的最简单的TCP服务器客户端}


客户端代码:
Windows 下的最简单的TCP服务器客户端class TCPClient
Windows 下的最简单的TCP服务器客户端{
Windows 下的最简单的TCP服务器客户端public:
Windows 下的最简单的TCP服务器客户端    TCPClient()
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        // 创建套接字
Windows 下的最简单的TCP服务器客户端
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
Windows 下的最简单的TCP服务器客户端        if (mServerSocket == INVALID_SOCKET)
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            std::cout << "创建套接字失败!" << std::endl;
Windows 下的最简单的TCP服务器客户端            return;
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端        // 填充服务器的IP和端口号
Windows 下的最简单的TCP服务器客户端
        mServerAddr.sin_family        = AF_INET;
Windows 下的最简单的TCP服务器客户端        mServerAddr.sin_addr.s_addr    = inet_addr(SERVER_IP);
Windows 下的最简单的TCP服务器客户端        mServerAddr.sin_port        = htons((u_short)SERVER_PORT);
Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端        // 连接到服务器
Windows 下的最简单的TCP服务器客户端
        if ( ::connect(mServerSocket, (struct sockaddr*)&mServerAddr, sizeof(mServerAddr)))
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            ::closesocket(mServerSocket);
Windows 下的最简单的TCP服务器客户端            std::cout << "连接服务器失败!" << std::endl;
Windows 下的最简单的TCP服务器客户端            return;    
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端    ~TCPClient()
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        ::closesocket(mServerSocket);
Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端    void run()
Windows 下的最简单的TCP服务器客户端    {
Windows 下的最简单的TCP服务器客户端        int nRecvSize = 0;
Windows 下的最简单的TCP服务器客户端        char buff[BUFFER_SIZE];
Windows 下的最简单的TCP服务器客户端        memset(buff, 0, sizeof(buff) );
Windows 下的最简单的TCP服务器客户端        while (nRecvSize = ::recv(mServerSocket, buff, BUFFER_SIZE, 0) )
Windows 下的最简单的TCP服务器客户端        {
Windows 下的最简单的TCP服务器客户端            if (mServerSocket == INVALID_SOCKET)
Windows 下的最简单的TCP服务器客户端            {                
Windows 下的最简单的TCP服务器客户端                break;
Windows 下的最简单的TCP服务器客户端            }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端            std::cout << buff << std::endl;
Windows 下的最简单的TCP服务器客户端        }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端        std::cout << "已经和服务器断开连接!" << std::endl;
Windows 下的最简单的TCP服务器客户端    }

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端private:
Windows 下的最简单的TCP服务器客户端    SOCKET        mServerSocket;    ///< 服务器套接字句柄
Windows 下的最简单的TCP服务器客户端
    sockaddr_in    mServerAddr;    ///< 服务器地址
Windows 下的最简单的TCP服务器客户端
};

Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端int _tmain(int argc, _TCHAR* argv[])
Windows 下的最简单的TCP服务器客户端{
Windows 下的最简单的TCP服务器客户端    TCPClient client;
Windows 下的最简单的TCP服务器客户端    client.run();
Windows 下的最简单的TCP服务器客户端
Windows 下的最简单的TCP服务器客户端    system("pause");
Windows 下的最简单的TCP服务器客户端    return 0;
Windows 下的最简单的TCP服务器客户端}

Windows 下的最简单的TCP服务器客户端
上一篇:linux双网卡绑定实现冗余与负载均衡


下一篇:iOS 消息推送原理