(C++服务器学习笔记):Windows环境TCP服务端、客户端案例

   日期:2020-12-28     浏览:176    评论:0    
核心提示:用Socket API建立简易TCP服务端、客户端用Socket API建立简易TCP服务端 建立一个socket 绑定接受客户端连接的端口 bind 监听网络端口 listen 等待接受客户端连接 accept 向客户端发送一条数据send 关闭socket closesocket 用Socket API建立简易TCP客户端 建立一个socket 连接服务器 connect 接收服务器信息 recv 关闭socket closesoc...

目录

用Socket API建立简易TCP服务端、客户端

设置工程输出目录和中间目录

创建基本的Windows网络环境

Windows服务端程序

Windows客户端程序

用Socket API建立简易TCP服务端、客户端

  • 用Socket API建立简易TCP服务端
    • 建立一个socket
    • 绑定接受客户端连接的端口 bind 
    • 监听网络端口 listen 
    • 等待接受客户端连接 accept 
    • 向客户端发送一条数据send 
    • 关闭socket  closesocket
  • 用Socket API建立简易TCP客户端
    • 建立一个socket
    • 连接服务器 connect
    • 接收服务器信息 recv
    • 关闭socket  closesocket

设置工程输出目录和中间目录

$(SolutionDir)../bin/$(Platform)/$(Configuration)\

$(SolutionDir)../temp/$(Platform)/$(Configuration)/$(ProjectName)\

创建基本的Windows网络环境

  • 引入头文件,WinSock2.h放在上面,否则出现重定义问题
#include <WinSock2.h>
#include <windows.h>
  • 或者使用宏 #define WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <WinSock2.h>
  • 创建基本的windows网络环境程序
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
    WORD ver = MAKEWORd(2,2);
    WSAData dat;
    WSAStartup(ver, &dat);

    WSACleanup();
    return 0;
}
  • 上面在代码中添加,为了跨平台,可以选择在项目属性,链接器,输入,附加依赖库中添加,而不写在代码中

  • 最终项目调试结果:

Windows服务端程序

#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <windows.h>
#include <WinSock2.h>
#include <cstdio>

#pragma comment(lib,"ws2_32.lib")

int main()
{
    WORD ver = MAKEWORd(2,2);
    WSAData dat;
    WSAStartup(ver, &dat);

    //1.创建socket套接字
    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    //2,bind 绑定用于接收客户端连接的端口
    sockaddr_in sinAddr = {};
    sinAddr.sin_family = AF_INET;
    sinAddr.sin_port = htons(5678); //host to net unsigned short
    sinAddr.sin_addr.S_un.S_addr = INADDR_ANY;  //inet_addr("127.0.0.1")
    if (SOCKET_ERROR == bind(sock, (sockaddr*)&sinAddr, sizeof(sockaddr_in)))
    {
        printf("Bind Error\n");
    }
    else
    {
        printf("Bind Success\n");
    }

    //3. listen 监听网络端口
    if (SOCKET_ERROR == listen(sock, 5))
    {
        printf("Listen Error\n");
    }
    else
    {
        printf("Listen Success\n");
    }
 
    //4.accept 接收客户端连接
    sockaddr_in clientAddr = {};
    int clAddrLen = sizeof(sockaddr_in);

    SOCKET sockAccpt = INVALID_SOCKET;    

    char msgBuff[] = "Hello,I am Sever.";
    int msgBuffLen = strlen(msgBuff) + 1;

    while(true)
    {
        sockAccpt = accept(sock, (sockaddr*)&clientAddr, &clAddrLen);

        if (INVALID_SOCKET == sockAccpt)
        {
            printf("Accept Error\n");
        }
        else
        {
            printf("Accept Success\n");
        }
        printf("新客户端地址:IP = %s \n", inet_ntoa(clientAddr.sin_addr));

        // 5.send 向客户端发送数据
        send(sockAccpt, msgBuff, msgBuffLen, 0);
    }

    // 6.closesocket 关闭套接字
    closesocket(sock);
    closesocket(sockAccpt);

    WSACleanup();
    return 0;
}
  • 针对于Windows设计的某些错误,如需要定义#define _WINSOCK_DEPRECATED_NO_WARNINGS,也可以通过关闭SDL检查排除

Windows客户端程序

#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <windows.h>
#include <WinSock2.h>
#include <cstdio>
#pragma comment(lib,"ws2_32.lib")

int main()
{
    WORD ver = MAKEWORd(2, 2);
    WSAData dat;
    WSAStartup(ver, &dat);

    //1.建立一个socket
    SOCKET sockCli = socket(AF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == sockCli)
    {
        printf("Socket Error\n");
    }
    else
    {
        printf("Socket Success\n");
    }

    //2. connect连接服务器
    sockaddr_in servAddr = {};
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(5678);
    servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    int ret = connect(sockCli, (sockaddr*)&servAddr, sizeof(sockaddr_in));

    if (SOCKET_ERROR == ret)
    {
        printf("Connect Error\n");
    }
    else
    {
        printf("Connect Success\n");
    }

    //3.接收服务器信息 recv
    char recvBuff[256] = {};
    int nlen = recv(sockCli, recvBuff, 256, 0);
    if (nlen > 0)
    {
        printf("接收到数据:%s \n", recvBuff);
    }


    //4.关闭套接字 closesocket
    closesocket(sockCli);

    WSACleanup();
    getchar();
    return 0;
}
  • 结果显示

  • 上述服务器与客户端通信过程小结:

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服