基於TCP的網絡應用程序的編寫

1、說明

這是一個最基本的實例,一個服務端,一個客戶端;代碼在vs2019下編譯通過;服務端和客戶端放在同一臺機器上運行效果如下:
在這裏插入圖片描述

2、代碼

1)服務端

// TCPSrv.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//

#include <Winsock2.h>
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <WS2tcpip.h>

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

int main()
{
   // 加載套子節庫
    WORD wVersionRequested;
    WSADATA wsaData;
    int err = 0;

    wVersionRequested = MAKEWORD(1, 1);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        return -1;
    }

    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
    {
        WSACleanup();
        return -1;
    }

    // 創建用於監聽的套接字
    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);

    // 綁定套接字
    bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    // 將套接字設爲監聽模式,準備接受用戶請求
    listen(sockSrv, 5);

    SOCKADDR_IN addrClient;
    int len = sizeof(SOCKADDR);

    while (true)
    {
        // 等待客戶請求的到來
        SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
        char strAddr[22];
        PCSTR ptrAddr = inet_ntop(AF_INET, &addrClient.sin_addr, strAddr, sizeof(strAddr));
        char sendBuf[300];
        time_t curTime = time(NULL);
        sprintf_s(sendBuf, "Welcome %s to TCP Serve at time: %d", ptrAddr, (int)curTime);

        // 發送數據
        send(sockConn, sendBuf, (int)strlen(sendBuf)+1,0);
        
        // 接收數據
        char recvBuf[100];
        recv(sockConn, recvBuf, 100, 0);

        // 打印接受的數據
        printf("%s\n", recvBuf);
        
        // 關閉套接字
        closesocket(sockConn);
    }

    return 0;
}

2)客戶端

// TCPClient.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//

#include <Winsock2.h>
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
    // 加載套子節庫
    WORD wVersionRequested;
    WSADATA wsaData;
    int err = 0;

    wVersionRequested = MAKEWORD(1, 1);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        return -1;
    }

    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
    {
        WSACleanup();
        return -1;
    }

    // 創建套接字
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN addrSrv;
    inet_pton(AF_INET, "127.0.0.1", &addrSrv.sin_addr.S_un.S_addr);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);

    // 向服務器發起請求
    connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    // 接收數據打印
    char recvBuf[100];
    recv(sockClient, recvBuf, 100, 0);
    printf("%s\n", recvBuf);

    Sleep(2000);

    // 發送數據
    time_t curTime = time(NULL);
    char sendBuf[200];
    sprintf_s(sendBuf, "Thank you! Nice to meet you at time: %d !", (int)curTime);
    send(sockClient, sendBuf, (int)strlen(sendBuf) + 1, 0);

    // 關閉套接字
    closesocket(sockClient);
    WSACleanup();

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章