Windows C语言 UDP通信demo

news2025/2/2 12:43:08

目录

  • 编译环境
  • 快速入门
    • 编译指令
  • 服务端code
  • 客户端code
  • 参考文章以及遇到的问题

编译环境

我的demo是通过此文章从C++更改成的C,编译环境使用的是Mingw,如下图所示
在这里插入图片描述

快速入门

  1. 拷贝代码
  2. 编译
  3. 互传消息

编译指令

  1. 客户端:gcc .\udpclient.c -lwsock32 -o udpclient.exe
  2. 服务端:gcc .\udpserver.c -lwsock32 -o udpserver.exe

在这里插入图片描述
运行两个可执行程序
在这里插入图片描述
客户端给目标地址(127.0.0.1(本机地址)),端口为4567发送数据数据nihao
在这里插入图片描述
本机服务端接收到客户端发送的数据,准备给客户端返回数据nihaoya
在这里插入图片描述
这时候已经代表了一次通讯的结束,代码中还有对bye的判断,其实是多余的,如下图所示,这时候服务端接收到了bye,退出了程序,但是客户端没退出,需要强制退出,所以我认为这个bye是多余的。
在这里插入图片描述

服务端code

udpserver.c

#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#pragma comment(lib, "ws2_32.lib")
#define BUFFER_SIZE 1024

#define SERVER_FAMILY AF_INET
#define SERVER_PORT 4567
#define SERVER_ADDR INADDR_ANY

void config_server(SOCKADDR_IN *addr_server)
{
    addr_server->sin_family = SERVER_FAMILY;
    addr_server->sin_port = htons(SERVER_PORT);
    addr_server->sin_addr.S_un.S_addr = SERVER_ADDR;
}

int main()
{
    WSADATA WSAData;
    char receBuf[BUFFER_SIZE];
    char Response[BUFFER_SIZE];
    if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
    {
        printf("init error\n");
        exit(1);
    }
    SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockServer == INVALID_SOCKET)
    {
        printf("Failed socket() \n");
        return 0;
    }
    SOCKADDR_IN addr_Server; // 服务器的地址等信息
    config_server(&addr_Server);

    if (bind(sockServer, (SOCKADDR *)&addr_Server, sizeof(addr_Server)) == SOCKET_ERROR)
    { // 服务器与本地地址绑定
        printf("Failed socket() %d \n", WSAGetLastError());
        return 0;
    }

    SOCKADDR_IN addr_Clt;
    int fromlen = sizeof(addr_Clt);

    while (true)
    {
        int last = recvfrom(sockServer, receBuf, sizeof(receBuf), 0, (SOCKADDR *)&addr_Clt, &fromlen);
        printf("last:%d\n", last);
        if (last > 0)
        {                         // 判断接收到的数据是否为空
            receBuf[last] = '\0'; // 给字符数组加一个'\0',表示结束了。不然输出有乱码
            if (strcmp(receBuf, "bye") == 0)
            {
                printf("client disconnect...\n");
                closesocket(sockServer);
                return 0;
            }
            else
            {
                printf("receive data(%s):%s\n", inet_ntoa(addr_Clt.sin_addr), receBuf);
            }
        }
        printf("please input send data:");
        scanf("%s", Response);
        printf("Response:%s,len:%d\n", Response, strlen(Response));
        int r_sento = sendto(sockServer, Response, strlen(Response), 0, (SOCKADDR *)&addr_Clt, sizeof(SOCKADDR));
        printf("return :%d\n", r_sento);
    }

    closesocket(sockServer);

    WSACleanup();
    return 0;
}

客户端code

udpclient.c

#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#pragma comment(lib, "ws2_32.lib")
#define BUFFER_SIZE 1024 // 缓冲区大小

#define SERVER_FAMILY AF_INET
#define SERVER_PORT 4567
#define SERVER_ADDR "127.0.0.1"

static char s_receBuf[BUFFER_SIZE]; // 发送数据的缓冲区
static char s_sendBuf[BUFFER_SIZE]; // 接受数据的缓冲区

void config_server(SOCKADDR_IN *addr_server)
{
    addr_server->sin_family = SERVER_FAMILY;
    addr_server->sin_port = htons(SERVER_PORT);
    addr_server->sin_addr.S_un.S_addr = inet_addr(SERVER_ADDR);
}

int main()
{
    SOCKET sock_Client; // 客户端用于通信的Socket
    WSADATA WSAData;

    if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
    {
        printf("init error");
        return -1;
    } // 初始化

    sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // 创建客户端用于通信的Socket

    SOCKADDR_IN addr_server; // 服务器的地址数据结构
    config_server(&addr_server);

    SOCKADDR_IN sock;
    int len = sizeof(sock);
    while (true)
    {
        printf("please input send data:");
        scanf("%s", s_sendBuf);
        sendto(sock_Client, s_sendBuf, strlen(s_sendBuf), 0, (SOCKADDR *)&addr_server, sizeof(SOCKADDR));
        // int last = recv(sock_Client, s_receBuf, strlen(s_receBuf), 0); // (调用recv和recvfrom都可以)
        int last = recvfrom(sock_Client, s_receBuf, sizeof(s_receBuf), 0, (SOCKADDR *)&sock, &len);
        printf("last:%d,%s\n", last, s_receBuf);
        if (last > 0)
        {
            s_receBuf[last] = '\0'; // 给字符数组加一个'\0',表示结束了。不然输出有乱码
            if (strcmp(s_receBuf, "bye") == 0)
            {
                printf("server disconnect\n");
                break;
            }
            else
            {
                printf("receive data:%s\n", s_receBuf);
            }
        }
    }

    closesocket(sock_Client);
    WSACleanup();

    return 0;
}

参考文章以及遇到的问题

参考文章:
C语言实现Windows下获取IP和MAC地址
Windows网络编程之UDP通信

其中Windows网络编程之UDP通信文章中客户端以及服务端都有bug,会造成通信失败,或者程序崩溃的情况。
服务端bug如下图所示
在这里插入图片描述
在这里插入图片描述
客户端bug如下图所示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《剑指offer》– 链表中倒数第k个节点、反转链表、合并两个排序的链表

一、链表中倒数时第k个节点&#xff1a; 1、题目&#xff1a; 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 2、解题思路&#xff1a;单链表具有单向移动的特性。 &#xff08;1&#xff09;第一种&#xff1a;先遍历链表&#xff0c;算出链表节点数count&#xf…

计算机毕设Python+Vue学生用品采购系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

我国风电行业发展现状:并网装机容量持续增长 产业集中化趋势明显

根据观研报告网发布的《2022年中国风电行业分析报告-行业全景评估与投资规划分析》显示&#xff0c;风电是一种清洁、绿色的可再生能源。风力发电是能源领域中技术最成熟、最具规模开发条件和商业化发展前景的发电方式之一。发展风力发电对于解决能源危机、减轻环境污染、调整能…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day13

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三明年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…

【1760. 袋子里最少数目的球】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#…

开发板到货记录一波

今天在终于拿到了期待已久的开发板RK3568&#xff0c;来&#xff0c;亮个相吧&#xff01;&#xff01;&#xff01; 开发板资源还是相当丰富的&#xff0c;对于学习安卓&Linux都是非常友好的&#xff0c;开发板默认安装的是安卓11系统&#xff0c;由于经费问题目前还没有…

小米发明“永动机”:走路即可为智能设备充电

蓝牙耳机、智能智能手表、智能手环、智能眼镜、智能手机……随着科技的进步&#xff0c;越来越多的移动与可穿戴智能设备开始走进我们的生活&#xff0c;智能设备在给人们生活带来便利的同时&#xff0c;也带来了一些困惑&#xff0c;越来越多诸如手环、TWS耳机等智能穿戴设备&…

火热的元宇宙,成为未来趋势

近年来&#xff0c;中国在算力上突飞猛进&#xff0c;有望成为世界顶尖&#xff0c;再加数据和算法上的优势&#xff0c;中国就很有可能在元宇宙方面率先开发出原创性的技术&#xff0c;从而实现从“0”到“1”的突破。 元宇宙办公 在未来的元宇宙畅想中&#xff0c;人们不仅…

java Lambda表达式的标准格式及其前提带有(代码演示)

观看本文 首先 你要对Lambda的概念有个基本了解 对此 您可以先查看我的文章 java Lambda概念 通过实现线程简单体验一下Lambda表达式 跟着上一篇文章做 你的代码会是这样 new Thread( () ->{System.out.println("执行线程"); } ).start();而其中Lambda 表达式 则…

资产种类多数量大、使用地点分散?集中管理,一招搞定

随着银行规模不断壮大&#xff0c;资产数量也随之不断增加&#xff0c;同时银行资产具有总量大、价值高、使用地点分散、管理难度大的特点&#xff0c;IT资产、房产、办公用品、维修保养需求随着业务的快速增长对管理工作带来了压力。 传统资产管理4大痛点 01.账实不符 实物账…

【Python机器学习】神经网络中常用激活函数、损失函数、优化方法(图文解释 附源码)

下面以经典的分类任务&#xff1a;MNIST手写数字识别&#xff0c;采用全连接层神经网络 MNIST数据集是一个手写体的数字图片集&#xff0c;它包含有训练集和测试集&#xff0c;由250个人手写的数字构成。训练集包含60000个样本&#xff0c;测试集包含10000个样本。每个样本包括…

数据结构基础--散列表

一、散列简介 散列表&#xff0c;又叫哈希表&#xff08;Hash Table&#xff09;&#xff0c;是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。也就是说&#xff0c;把关键字映射到一个表中的位置来直接访问记录&#xff0c;以加快访问速度。 通常&#xff0…

Android设计模式详解之建造者模式

前言 Builder模式是一种创建型设计模式。 定义&#xff1a;将一个复杂对象的创建与它的表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。 使用场景&#xff1a; 相同的方法&#xff0c;不同的执行顺序&#xff0c;产生不同的事件结果时&#xff1b;多个部件或零…

java学习day63(乐友商城)商品新增后台、商品编辑后台、搭建前台系统页面

1.商品新增 当我们点击新增商品按钮&#xff1a; 就会出现一个弹窗&#xff1a; 里面把商品的数据分为了4部分来填写&#xff1a; 基本信息&#xff1a;主要是一些简单的文本数据&#xff0c;包含了SPU和SpuDetail的部分数据&#xff0c;如 商品分类&#xff1a;是SPU中的cid1&…

大型项目都会使用到的Makefile

一、vi编辑器之神 1.vi编辑器的三种模式&#xff1a; 插入模式&#xff1a;可以编辑文档 编辑模式&#xff1a;可以敲一些命令&#xff0c;执行例如复制n行 剪切n行 &#xff0c;粘贴等功能 命令模式:(最后一行模式&#xff09; 在此模式下可以保存文件&#xff0c;退出vi…

第03讲:Redis的持久化方案

前言 redis是一个内存数据库&#xff0c;当redis服务器重启&#xff0c;获取电脑重启&#xff0c;数据会丢失&#xff0c;我们可以将redis内存中的数据持久化保存到硬盘的文件中。 redis提供两种持久化方式: RDB&#xff1a;快照&#xff0c;通过从服务器保存和持久化AOF&…

Codeforces Round #839 (Div. 3) A~G all answer

Dashboard - Codeforces Round #839 (Div. 3) - Codeforces 最近状态奇差无比&#xff0c;还有点生病&#xff0c;低烧反复横跳&#xff0c;应该没阳&#xff1f;&#xff08;虽然家人都阳了&#xff0c;就剩我一个了wuwuwu&#xff5e;&#xff08;A B C就不作解释了&#xff…

【小5聊】Python3 使用selenium模块实现简单爬虫系列一

第一次听说Python还是在工作的时候&#xff0c;还是一位女生在用&#xff0c;当时她说可以用来处理excel文档&#xff0c;特别是一些统计分析。第二次让我真正进入python世界&#xff0c;还是在一次C站举办的大赛上。聊聊你是因为什么机缘巧合进入到python圈的呢&#xff1f;不…

金盾杯2022-AGCTFS战队 wp

文章目录Web图书馆EzPHPeZphp2SQLSkip有来无回反败为胜Crypto小菜一碟RRSSAAsimpleRrandMISC盗梦空间qianda0_Sudoku数据泄露01-账号泄露追踪数据泄露02-泄露的密码数据泄露03-泄露的密钥ReverseTeaPwnLoginWtfWeb 图书馆 根据提示找到 干货&#xff5c;最全的Tomcat漏洞复现…

Qt5 网页标题、关键词提取工具Findyou

Qt5 网页标题、关键词提取工具Findyou 一、程序运行 运行界面 辅助功能&#xff0c;可用于将扫描器的扫描结果转换为url 二、所涉及的重要知识点 1、Qt爬取https的网页 来自宇龍_ https://blog.csdn.net/qq_45809384/article/details/122049295?spm1001.2014.3001.5506 打…