前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网络编程第三讲UDP编写

网络编程第三讲UDP编写

作者头像
IBinary
发布2019-05-25 16:20:04
4130
发布2019-05-25 16:20:04
举报
文章被收录于专栏:逆向技术逆向技术

            网络编程第三讲UDP编写

一丶UDP简介

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

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

下图为TCP 跟UDP的区别.

UDP下收发函数有区别.

  发送数据: TCP: send UDP sendto

  接受数据:TCP: recv UDP recvfrom

二丶UDP编写的完整代码

服务端:

代码语言:javascript
复制
#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\n");
        return -1;
    }
 
    //建立一个UDP的socket
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == SOCKET_ERROR)
    {
        printf("create socket failed\n");
        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]\n", 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]\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
    }
    return 0;
}

客户端

代码语言:javascript
复制
#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\n");
        return -1;
    }
    //建立一个UDP的socket
    SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockClient == INVALID_SOCKET)
    {
        printf("create socket failed\n");
        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\n", buf);
        return -1;
    }
    printf("send msg:%s\n", 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\n", recvBuf);
    //关闭SOCKET连接
    closesocket(sockClient);
    //清理网络环境
    WSACleanup();
    system("pause");
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •             网络编程第三讲UDP编写
    • 一丶UDP简介
      • 二丶UDP编写的完整代码
        • 服务端:
        • 客户端
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档