Windows 下的最简单的TCP服务器客户端-阿里云开发者社区

开发者社区> 杨粼波> 正文

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

简介:
+关注继续查看

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


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

None.gif#include <WinSock2.h>
None.gif#pragma comment( lib, "ws2_32.lib" )



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

None.gifclass WinSocketSystem
ExpandedBlockStart.gif{
InBlock.gifpublic:
InBlock.gif    WinSocketSystem()
ExpandedSubBlockStart.gif    {
InBlock.gif        int iResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
InBlock.gif        if (iResult != NO_ERROR)
ExpandedSubBlockStart.gif        {
InBlock.gif            exit(-1);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    ~WinSocketSystem()
ExpandedSubBlockStart.gif    {
InBlock.gif        WSACleanup();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gifprotected:
InBlock.gif    WSADATA wsaData;
ExpandedBlockEnd.gif}
;
None.gif
None.gifstatic WinSocketSystem g_winsocketsystem;


服务器端代码:
None.gifclass TCPServer
ExpandedBlockStart.gif{
InBlock.gifpublic:
InBlock.gif    TCPServer()
InBlock.gif        : mServerSocket(INVALID_SOCKET)
ExpandedSubBlockStart.gif    {
InBlock.gif        // 创建套接字
InBlock.gif
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
InBlock.gif        if (mServerSocket == INVALID_SOCKET)
ExpandedSubBlockStart.gif        {
InBlock.gif            std::cout << "创建套接字失败!" << std::endl;
InBlock.gif            return;
ExpandedSubBlockEnd.gif        }

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

InBlock.gif
InBlock.gif        // 监听客户端请求,最大同时连接数设置为10.
InBlock.gif
        if ( ::listen(mServerSocket, SOMAXCONN) == SOCKET_ERROR)
ExpandedSubBlockStart.gif        {
InBlock.gif            std::cout << "监听端口失败!" << std::endl;
InBlock.gif            return;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        std::cout << "启动TCP服务器成功!" << std::endl;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    ~TCPServer()
ExpandedSubBlockStart.gif    {
InBlock.gif        ::closesocket(mServerSocket);
InBlock.gif        std::cout << "关闭TCP服务器成功!" << std::endl;
ExpandedSubBlockEnd.gif    }

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

InBlock.gif
InBlock.gif            // 关闭客户端套接字
InBlock.gif
            ::closesocket(mAcceptSocket);
InBlock.gif            std::cout << "断开客户端端成功!" << std::endl;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gifprivate:
ExpandedSubBlockStart.gif    SOCKET        mServerSocket;    ///< 服务器套接字句柄
InBlock.gif
    sockaddr_in    mServerAddr;    ///< 服务器地址
ExpandedSubBlockEnd.gif

ExpandedSubBlockStart.gif    SOCKET        mAcceptSocket;    ///< 接受的客户端套接字句柄
InBlock.gif
    sockaddr_in    mAcceptAddr;    ///< 接收的客户端地址
ExpandedSubBlockEnd.gif
};

InBlock.gif
InBlock.gifint _tmain(int argc, _TCHAR* argv[])
ExpandedSubBlockStart.gif{
InBlock.gif    TCPServer server;
InBlock.gif    server.run();
InBlock.gif
InBlock.gif    return 0;
ExpandedSubBlockEnd.gif}


客户端代码:
None.gifclass TCPClient
ExpandedBlockStart.gif{
InBlock.gifpublic:
InBlock.gif    TCPClient()
ExpandedSubBlockStart.gif    {
InBlock.gif        // 创建套接字
InBlock.gif
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
InBlock.gif        if (mServerSocket == INVALID_SOCKET)
ExpandedSubBlockStart.gif        {
InBlock.gif            std::cout << "创建套接字失败!" << std::endl;
InBlock.gif            return;
ExpandedSubBlockEnd.gif        }

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

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    ~TCPClient()
ExpandedSubBlockStart.gif    {
InBlock.gif        ::closesocket(mServerSocket);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    void run()
ExpandedSubBlockStart.gif    {
InBlock.gif        int nRecvSize = 0;
InBlock.gif        char buff[BUFFER_SIZE];
InBlock.gif        memset(buff, 0, sizeof(buff) );
InBlock.gif        while (nRecvSize = ::recv(mServerSocket, buff, BUFFER_SIZE, 0) )
ExpandedSubBlockStart.gif        {
InBlock.gif            if (mServerSocket == INVALID_SOCKET)
ExpandedSubBlockStart.gif            {                
InBlock.gif                break;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            std::cout << buff << std::endl;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        std::cout << "已经和服务器断开连接!" << std::endl;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gifprivate:
ExpandedSubBlockStart.gif    SOCKET        mServerSocket;    ///< 服务器套接字句柄
InBlock.gif
    sockaddr_in    mServerAddr;    ///< 服务器地址
ExpandedSubBlockEnd.gif
};

InBlock.gif
InBlock.gif
InBlock.gifint _tmain(int argc, _TCHAR* argv[])
ExpandedSubBlockStart.gif{
InBlock.gif    TCPClient client;
InBlock.gif    client.run();
InBlock.gif
InBlock.gif    system("pause");
InBlock.gif    return 0;
ExpandedSubBlockEnd.gif}

InBlock.gif

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MaxCompute客户端(odpscmd)在windows命令行下查询中文乱码问题处理实践
MaxCompute客户端工具是阿里云大数据计算服务MaxCompue产品官方客户端工具,通过客户端工具可以连接MaxCompute项目,完成包括数据管理、数据上下传、作业执行、用户及授权管理等各项操作。
5432 0
《云栖TechDay》第9期:钉钉客户端自动化的应用
在4月9日的云栖TechDay活动上,卞伟为大家分享了钉钉客户端自动化的应用。钉钉产品是阿里的一款企业级IM工具,版本更新也很迅速,在迭代过程中,团队通过UI自动化对核心功能进行验证,节约回归的人力成本,并在自动化框架的基础上,针对特定场景的性能、弱网下的聊天功能也进行了自动化的改造。
4683 0
客户端,服务器,天气预报
引用:http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端action请求数据。
657 0
【转】自动实时监控Windows2003服务器终端登录并发邮件和发短信通知
记得以前管理的一批windows服务器,一些开源程序做的web站点总会遭到入侵。然而就想找找看有没有办法可以知道服务器有没有被入侵。服务器在什么时候登陆过,如果登陆马上发邮件通知,感觉这种问题肯定有人处理过,于是网上搜罗了一下。
1112 0
Netty:一个非阻塞的客户端/服务器框架
Netty:一个非阻塞的客户端/服务器框架 Netty是一个异步事件驱动的网络应用框架,为Java网络应用的开发带来了一些新活力。Netty由协议服务器和客户端所组成,可用于快速开发可维护的高性能软件。
1021 0
+关注
杨粼波
网游的老兵
1135
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载