网络编程基础_4.2TCP-客户端

TCP-客户端

#include <stdio.h>

// 1. 包含必要的头文件和库, 必须位于 windows之前
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

#include <windows.h>
#include <ws2tcpip.h>

// TCP 和 UDP 时处于传输层的两个协议
// - TCP 是一个基于连接的,安全的传输协议,实现相对复杂
// - UDP 是一个基于无连接的,不安全的传输协议,实现相对简单

// 工具函数,用于判断是否执行成功
VOID CheckResult(BOOL Value, LPCWSTR ErrMsg)
{
    // 如果 Value 非空,就表示执行成功
    if (Value == FALSE)
    {
        printf("ErrMsg: %ls\n", ErrMsg);
        system("pause"); ExitProcess(0);
    }
}




int main()
{
    // 2. 初始化网络环境并判断是否成功[ 搜索信号(2G?3G?4G?) ]
    WSAData WsaData = { 0 };
    if (!WSAStartup(MAKEWORD(2, 2), &WsaData))
        CheckResult(WsaData.wVersion == 0x0202, L"初始化网络环境失败");

    // 3. 创建套接字(IP+PORT) [ 买手机 ]
    //    - 参数一: 协议族, 表示需要进行什么类型的传输
    //    - 参数二: 使用的是流式套接字还是数据报套接字,原始套接字
    //    - 参数三,对应参数二的类型,TCP\UDP
    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));

    // 7. 发送数据和接收数据
    CHAR Buffer[0x100] = { 0 };
    // 调用成功返回值为收发的字节数,否则为 SOCKET_ERROR
    recv(ClientSocket, Buffer, 0x100, 0);
    printf("Server: %s", Buffer);
    send(ClientSocket, "how are you", 12, 0);

    // 8. 关闭套接字执行清理工作
    shutdown(ClientSocket, SD_BOTH);
    closesocket(ClientSocket);

    // 9. 清理网络环境
    WSACleanup();

    system("pause");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ltyandy/p/10945980.html