zoukankan      html  css  js  c++  java
  • 网络编程第三讲UDP编写

                 网络编程第三讲UDP编写

    一丶UDP简介

      UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP

    UDP不需要建立建立. 下面有UDP编写流程图

    下图为TCP 跟UDP的区别.

    UDP下收发函数有区别.  

      发送数据: TCP: send UDP sendto

      接受数据:TCP: recv  UDP recvfrom

    二丶UDP编写的完整代码

    服务端:

      

    #include <stdio.h>
    #include <winsock2.h>
    #include <Windows.h>
     
    #pragma comment(lib,"ws2_32.lib")
    #define  PORT 6000
     
    int main(int argc, char* argv[])
    {
        //初始化网络环境
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
        {
            printf("WSAStartup failed
    ");
            return -1;
        }
     
        //建立一个UDP的socket
        SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (sock == SOCKET_ERROR)
        {
            printf("create socket failed
    ");
            return -1;
        }
     
        //绑定地址信息
        sockaddr_in serverAddr;
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_port = htons(PORT);
        serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
     
        bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr));
        
        char buf[512];
        while (TRUE)
        {
            memset(buf, 0, 512);
            // 网络节点的信息,用来保存客户端的网络信息
            sockaddr_in clientAddr;
            memset(&clientAddr, 0, sizeof(sockaddr_in));
     
            int clientAddrLen = sizeof(sockaddr);
            //接收客户端发来的数据
            int ret = recvfrom(sock, buf, 512, 0,(sockaddr*) &clientAddr,&clientAddrLen );
            
            printf("Recv msg:%s from IP:[%s] Port:[%d]
    ", buf,inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));
            // 发一个数据包返回给客户
            sendto(sock, "Hello World!", strlen("Hello World!"), 0, (sockaddr*)&clientAddr, clientAddrLen);
            printf("Send msg back to IP:[%s] Port:[%d]
    ", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
        }
        return 0;
    }

    客户端

      

    #include <stdio.h>
    #include <winsock2.h>
    #include <Windows.h>
     
    #pragma comment(lib,"ws2_32.lib")
    #define  PORT 6000
    int main(int argc, char* argv[])
    {
        //初始化网络环境
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
        {
            printf("WSAStartup failed
    ");
            return -1;
        }
        //建立一个UDP的socket
        SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (sockClient == INVALID_SOCKET)
        {
            printf("create socket failed
    ");
            return -1;
        }
        // 申明一个网络地址信息的结构体,保存服务器的地址信息
        sockaddr_in addr = { 0 };
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
     
        char buf[] = "client test!";
        //发送数据
        int dwSent = sendto(sockClient, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(SOCKADDR));
        if (dwSent == 0)
        {
            printf("send %s failed
    ", buf);
            return -1;
        }
        printf("send msg:%s
    ", buf);
     
        char recvBuf[512];
        memset(recvBuf, 0, 512);
     
        sockaddr_in addrSever = { 0 };
        int nServerAddrLen=sizeof(sockaddr_in);
        // 接收数据
        int dwRecv = recvfrom(sockClient, recvBuf, 512, 0, (SOCKADDR *)&addrSever,&nServerAddrLen);
        printf("Recv msg from server : %s
    ", recvBuf);
        //关闭SOCKET连接
        closesocket(sockClient);
        //清理网络环境
        WSACleanup();
        system("pause");
        return 0;
    }

     链接:https://pan.baidu.com/s/11Gzqv-wynDslzCMnTgnpCw 密码:8f63

  • 相关阅读:
    Typescript和React结合项目初始化
    React 和 TypeScript 如何一起使用
    Cesium取代leaflet,和Vue等前端框架结合
    cesium之3dtiles的制作问题
    Cesium-3dTiles格式详解
    TIN和等高线的关系
    CAD如何生成等高线
    Cesium风场
    cesium加载等高线
    DEM坡度和坡向分析
  • 原文地址:https://www.cnblogs.com/iBinary/p/9671780.html
Copyright © 2011-2022 走看看