• 基于UDP(面向无连接)的socket编程


    说明:

    本程序是基于windows socket的套接字库实现网络编程;
    当WSAStartup函数调用成功后,在程序的最后都需要相应的调用WSACleanup函数
    以便释放为该应用程序分配的资源,终止对WinSock动态库的使用。

    基于UDP的服务器端流程

    1. 创建套接字(socket)
    2. 将套接字和IP地址、端口号绑定在一起(bind)
    3. 等待客户端发起数据通信(recvfrom/recvto)
    4. 关闭套接字

    基于UDP的客户端流程

    1. 创建套接字(socket)
    2. 向服务器发起通信(recvfrom/recvto)
    3. 关闭套接字

    基于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
    ",szBuffer);
            //发送数据
            char szSendBuf[100] = "this is server";
            sendto(socketSrv, szSendBuf, 100,0,(SOCKADDR*)&addClient,len);
        }
    
    
        //关闭套接字
        closesocket(socketSrv);
    
        //关闭winsocket库
        WSACleanup();
    
        system("pause");
    
        return 0;
    }

    客户端代码:

    #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
    ", szRecvBuf);
    
        //关闭套接字
        closesocket(socketClient);
    
        //关闭winsocket库
        WSACleanup();
    
        system("pause");
        return 0;
    }

    测试效果:

    这里写图片描述

  • 相关阅读:
    4:4 自定义拦截器
    DDD学习笔记一
    Winform/WPF国际化处理
    NPOI 操作Excel
    将输入的字符串进行大写格式化
    将输入的字符串分2个字符添加空格并大写格式化
    VS使用技巧
    NotifyIcon用法
    C#Winfrom系统打印机调用/设置默认打印机
    TextBox(只允许输入字母或者数字)——重写控件
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468304.html
Copyright © 2020-2023  润新知