zoukankan      html  css  js  c++  java
  • 网络编程基础_5.1聊天室-客户端

    聊天室-客户端

    #include <stdio.h>
    
    // 1. 包含必要的头文件和库, 必须位于 windows之前
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    
    #include <windows.h>
    #include <ws2tcpip.h>
    
    // 工具函数,用于判断是否执行成功
    VOID CheckResult(BOOL Value, LPCWSTR ErrMsg)
    {
        // 如果 Value 非空,就表示执行成功
        if (Value == FALSE)
        {
            printf("ErrMsg: %ls
    ", ErrMsg);
            system("pause"); ExitProcess(0);
        }
    }
    
    
    // 用于执行接收数据的线程
    DWORD WINAPI ThreadRoutine(LPVOID lpThreadParameter)
    {
        // 用于保存接收的数据
        CHAR Buffer[0x100] = { 0 };
    
        // 1. 获取到套接字的句柄
        SOCKET Socket = (SOCKET)lpThreadParameter;
    
        // 2. 在循环中不断的接收数据,如果返回值为
        while (recv(Socket, Buffer, 0x100, 0) > 0)
        {
            // 输出数据
            printf("Server: %s
    ", Buffer);
        }
    
        return 0;
    }
    
    
    int main()
    {
        // 2. 初始化网络环境并判断是否成功[ 搜索信号(2G?3G?4G?) ]
        WSAData WsaData = { 0 };
        if (!WSAStartup(MAKEWORD(2, 2), &WsaData))
            CheckResult(WsaData.wVersion == 0x0202, L"初始化网络环境失败");
    
        // 3. 创建套接字(IP+PORT) [ 买手机 ]
        SOCKET ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        CheckResult(ClientSocket != INVALID_SOCKET, L"套接字创建失败");
    
        // 4. 连接到服务器(打电话)
        sockaddr_in ServerAddr = { 0 };
        ServerAddr.sin_port = htons(0x1515);        // 端口
        ServerAddr.sin_family = AF_INET;            // 协议类型
        inet_pton(AF_INET, "127.0.0.1", &ServerAddr.sin_addr.S_un);
        connect(ClientSocket, (SOCKADDR*)& ServerAddr, sizeof(sockaddr_in));
    
        // 5. 创建线程用于执行接收数据的操作,将套接字句柄作为参数传入
        CreateThread(NULL, NULL, ThreadRoutine, (LPVOID)ClientSocket, NULL, NULL);
    
        // 6. 在循环中不断的发送数据
        CHAR Buffer[0x100] = { 0 };
        while (scanf_s("%s", Buffer, 0x100) && strcmp(Buffer, "quit"))
        {
            // 发送输入的数据
            send(ClientSocket, Buffer, strlen(Buffer) + 1, 0);
        }
    
        // 7. 关闭套接字执行清理工作
        shutdown(ClientSocket, SD_BOTH);
        closesocket(ClientSocket);
    
        // 8. 清理网络环境
        WSACleanup();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    JSP中自动刷新
    JSP点击计数器
    JSP页面重定向
    JSP处理日期
    Mybatis Generator生成数据库自带的中文注释
    GMT与Etc/GMT地区信息的时区转换
    《Redis入门指南》第2版 读书笔记
    ConcurrentHashMap
    应用服务器性能优化 之 消息队列(MQ:Message Queue)
    TabLayout让Fragment在ViewPager中的滑动切换更优雅
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10945995.html
Copyright © 2011-2022 走看看