基於UDP(面向無連接)的socket編程 轉

說明:

本程序是基於windows socket的套接字庫實現網絡編程;
當WSAStartup函數調用成功後,在程序的最後都需要相應的調用WSACleanup函數
以便釋放爲該應用程序分配的資源,終止對WinSock動態庫的使用。

基於UDP的服務器端流程

    創建套接字(socket)
    將套接字和IP地址、端口號綁定在一起(bind)
    等待客戶端發起數據通信(recvfrom/recvto)
    關閉套接字

基於UDP的客戶端流程

    創建套接字(socket)
    向服務器發起通信(recvfrom/recvto)
    關閉套接字

基於UDP的socket編程流程圖

基於UDP的socket編程不需要設置監聽和發起/接收請求,可以直接相互通信,流程如下:
這裏寫圖片描述

服務器端代碼:

#include "stdafx.h"
#include <Winsock2.h>


int _tmain(int argc, _TCHAR* argv[])
{
    WORD dwVersionReq = MAKEWORD(1,1);
    WSAData wsData = {0};
    //加載套接字庫
    if (0 != WSAStartup(dwVersionReq,&wsData))
    {
        WSACleanup();
        return 0;
    }
    //socket版本確認
    if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion != 1))
    {
        WSACleanup();
        return 0;
    }

    //創建服務套接字
    SOCKET socketSrv = socket(AF_INET,SOCK_DGRAM,0/*自動選擇協議*/);

    //對socket綁定端口號和IP地址
    SOCKADDR_IN addrServer;
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(6000);
    addrServer.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
    bind(socketSrv,(SOCKADDR*)&addrServer,sizeof(addrServer));


    //保存client端socket信息
    SOCKADDR_IN addClient;
    int len = sizeof(SOCKADDR_IN);

    while (1)
    {
        //等待並接收數據
        char szBuffer[100] = {0};
        recvfrom(socketSrv,szBuffer,100,0,(SOCKADDR*)&addClient,&len);
        printf("client->server:%s\n",szBuffer);
        //發送數據
        char szSendBuf[100] = "this is server";
        sendto(socketSrv, szSendBuf, 100,0,(SOCKADDR*)&addClient,len);
    }


    //關閉套接字
    closesocket(socketSrv);

    //關閉winsocket庫
    WSACleanup();

    system("pause");

    return 0;
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58

客戶端代碼:

#include "stdafx.h"
#include <Winsock2.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //指定wind socket版本
    WORD dwVersionReq = MAKEWORD(1,1);
    WSAData wsData = {0};

    //加載套接字庫dll
    if (0 != WSAStartup(dwVersionReq,&wsData))
    {
        WSACleanup();
        return 0;
    }

    //版本判斷
    if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion != 1))
    {
        WSACleanup();
        return 0;
    }

    //創建套接字
    SOCKET socketClient = socket(AF_INET,SOCK_DGRAM,0);

    //填充服務器socket信息
    SOCKADDR_IN addrServer;
    int nLength = sizeof(addrServer);
    addrServer.sin_family = AF_INET;
    //服務器的應用程序端口
    addrServer.sin_port = htons(6000);
    //服務器的IP地址,同一臺電腦就是本地IP
    addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    //發送數據
    char szClientBuf[100]= "this is client";
    sendto(socketClient,szClientBuf,100,0,(SOCKADDR*)&addrServer,nLength);

    //介紹數據
    char szRecvBuf[100] = {0};
    recvfrom(socketClient,szRecvBuf,100,0,(SOCKADDR*)&addrServer,&nLength);
    printf("server->client:%s\n", szRecvBuf);

    //關閉套接字
    closesocket(socketClient);

    //關閉winsocket庫
    WSACleanup();

    system("pause");
    return 0;
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53

測試效果:

這裏寫圖片描述

---------------------
作者:小怪獸and奧特曼
來源:CSDN
原文:https://blog.csdn.net/c_base_jin/article/details/69681066
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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