Linux实现简单的udp服务端和客户端(C/C++)

2023-05-16

udp_server.cpp

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>

using namespace std;

static int port = 1997;

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(-1 == sockfd)
    {
        cout << "socket() error" << endl;
        return -1;
    }

    struct sockaddr_in serveraddr, clientaddr;
    socklen_t len = sizeof(struct sockaddr_in);

    memset(&serveraddr, 0, len); // 不建议使用bzero,因为memset跨平台
    memset(&clientaddr, 0, len);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(port);
    // serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); // 可以收到来自任何ip的消息

    if(-1 == bind(sockfd, (struct sockaddr*)&serveraddr, len))
    {
        cout << "bind() error" << endl;
        close(sockfd);
        return -2;
    }

    const int buf_len = 100;
    char buf[buf_len] = { 0 };
    while(1)
    {
        memset(buf, 0, buf_len);
        // 显然这个recvfrom是一个阻塞函数(当然也可以设置成非阻塞的)
        // 在命令行使用 man recvfrom 可得知
        // recv(sockfd, buf, len, flags);
        // 相当于
        // recvfrom(sockfd, buf, len, flags, NULL, NULL);
        // 个人理解如果不关心是哪个ip发过来的消息就可以向上面这么用
        // 第四个参数一般设为0
        if(-1 == recvfrom(sockfd, buf, buf_len, 0, (struct sockaddr*)&clientaddr, &len))
        {
            cout << "recvfrom() error" << endl;
            close(sockfd);
            return -3;
        }
        cout << "client ip: " << inet_ntoa(clientaddr.sin_addr) << endl;
        cout << "client port: " << ntohs(clientaddr.sin_port) << endl;
        cout << "client msg: " << buf << endl;
        cout << endl;

        strcpy(buf, "I am server!");
        // sendto 的第四个参数貌似也常设为0,没有深究
        if(-1 == sendto(sockfd, buf, buf_len, 0, (struct sockaddr*)&clientaddr, len))
        {
            cout << "sendto() error" << endl;
        }
    }

    close(sockfd);
    return 0;
}

udp_client.cpp

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>

using namespace std;

const int port = 1997;
const char* server_ip = "10.4.64.221";

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(-1 == sockfd)
    {
        cout << "socket() error" << endl;
        return -1;
    }

    socklen_t len = sizeof(struct sockaddr_in);
    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0, len);

    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(port);
    serveraddr.sin_addr.s_addr = inet_addr(server_ip);

    const int buf_len = 100;
    char buf[buf_len] = { 0 };
    string s;
    while(1)
    {
        // 使用getline来从命令行获得输入是因为即使遇到空格也会当成一个字符串
        // 使用cin则达不到这样的效果
        getline(cin, s);
        strcpy(buf, s.c_str());
        if(-1 == sendto(sockfd, buf, buf_len, 0, (struct sockaddr*)&serveraddr, len))
        {
            cout << "sendto() error" << endl;
            close(sockfd);
            return -2;
        }
        if(-1 == recvfrom(sockfd, buf, buf_len, 0, NULL, NULL))
        {
            cout << "recvfrom() error" << endl;
            close(sockfd);
            return -3;
        }
        cout << "receive from server: " << buf << endl;
    }


    close(sockfd);
    return 0;
}

makefile

.PHONY:all
all:server client

server:udp_server.cpp
	g++ -o $@ $^ -g

client:udp_client.cpp
	g++ -o $@ $^ -g

.PHONY:clean
clean:
	rm -rf server client

直接在命令行输入make即可编译。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux实现简单的udp服务端和客户端(C/C++) 的相关文章

  • 解决Mysql ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘

    记录一次Mac使用brew安装mysql后 xff0c 无法正常打开问题 在使用brew安装好mysql后 xff0c 发现使用启动命令 xff1a mysql server start 提示 xff1a xff08 两种可能情况 xff0
  • 简单分析DMVPN技术

    定义 xff1a 动态多点VPN 技术组成 xff1a MGRE 43 NHRP 43 IPSEC MGRE 解决隧道的封装技术NHRP 解决多点网络的通信技术IPSEC 解决专线的加密技术 技术特点 xff1a 由客户自行配置维护 xff
  • 小型企业网的搭建(企业网三层架构)

    将邮箱放置在这个链接里面 xff0c 我私信发送配置给你们 邮箱地址填写处 xff0c 点击这里直接跳转 需要配置的同学请手动去github clone xff0c 不了解github的同学建议花时间学习一下 xff0c 受益无穷 xff0
  • Linux各种(常用)编辑器

    了解如何通过命令行快速有效地编辑文件对每个Linux系统管理员都至关重要 文件编辑每天执行 xff0c 无论是配置文件 xff0c 用户文件 xff0c 文本文档还是您需要编辑的任何文件 这就是为什么选择一个喜欢的命令行文本编辑器并掌握它的
  • C语言实现1/1-1/2+1/3-...-1/100求和

    观察题目要求可以看出 xff0c 底数为奇数是前面符号为正 xff0c 偶数是则为负 那么我们可以考虑使用一下方式完成求解 解法一 xff1a span class token macro property span class token
  • 什么是localhost(127.0.0.1)?

    什么是本地主机 xff1f 当你在计算机上 ping IP地址时 xff0c 你尝试联系互联网上的另一台计算机 xff0c 但是当你ping IP地址127 0 0 1时 xff0c 你正在与本地主机通信 localhost 始终是你自己的
  • OpenCV图像处理技术——图像直方图

    OpenCV图像处理技术 图像直方图 Fu Xianjun All Rights Reserved 图像直方图 图像直方图是图像内灰度值的统计特性与图像灰度值之间的函数 xff0c 直方图统计图像内各个灰度级出现的次数 直方图是数值数据分布
  • 【wireshark】Ubuntu 安装 wireshark 以及 wireshark 过滤器的使用

    目录 1 安装wireshark 2 wireshark 过滤器比较符号 3 wireshark 过滤方式 1 根据 IP 地址过滤 2 根据端口号过滤 3 根据报文长度过滤 4 HTTP协议过滤 参考文章链接 xff1a Wireshar
  • C++学习001:对象、可扩展性、编译型语言、相较于C的变化

    1 面向对象 基于对象 基于过程的区别 基于过程 xff1a 从上到下依次执行 xff0c C语言 cpp额外实现了基于对象和面向对象 基于对象 xff1a 类作为结构 类的成员作为对象 基于对象就是通过封装对象方便了程序过程中发生的突发事
  • Arduino基础入门篇23—串口通讯

    在很多时候 xff0c Arduino需要和其他设备相互通讯 xff0c 而最常见最简单的方式就是串口通讯 本篇介绍Arduino硬件串口通讯 xff0c 了解相关函数的使用 1 硬件串口 在PC机上最常见的串行通讯协议是RS 232串行协
  • 基于Qt的车载GPS监控系统(7)数据记录

    基于Qt的车载GPS监控系统 xff08 7 xff09 数据记录 数据日志显示界面 系统数据记录功能实现说明 1 通过一个线程定时记录系统当前的温度数据 2 通过数据日志界面显示保存的日志数据 数据记录线程代码 span class hl
  • 嵌入式系统重定向printf的三种方法

    对printf 进行重定向的三种方法 方法1 使用MircoLib并重定义fputc方法2 停用半主机模式 xff0c 在MDK中使用标准库重定向printf 方法3 在Gcc中使用标准库重定向printf 1 MDK使用MircoLib并
  • Windows API程序入门学习(1)

    导航 Windows API程序入门学习 xff08 1 xff09 学习目的作业要求实现步骤参考书籍实现代码运行结果 Windows API程序入门学习 xff08 1 xff09 学习目的 了解 windows操作系统应用程序开发的基本
  • 嵌入式系统基础学习笔记(四)

    目录 一 GDB调试简例1 1 例11 2 例2 二 OpenCV入门2 1 在Windows下使用OpenCV 3 4 82 1 1 OpenCV的安装与配置2 1 2 一个简单的OpenCV对图片特效显示例子 2 2 在Ubuntu18
  • 计算机网络实验报告(二):Wireshark 实验

    文章目录 一 数据链路层二 网络层三 传输层四 应用层 本部分按照数据链路层 网络层 传输层以及应用层进行分类 xff0c 共有 10 个实验 需要使用协议分析软件 Wireshark 进行 xff0c 请根据简介部分自行下载安装 准备 请
  • 计算机网络实验报告(三):Cisco Packet Tracer 实验

    文章目录 一 CPT 软件使用简介二 直接连接两台 PC 构建 LAN三 用交换机构建 LAN四 交换机接口地址列表五 生成树协议 xff08 Spanning Tree Protocol xff09 六 路由器配置初步说明一说明二说明三说
  • 嵌入式系统应用开发实验(一)

    文章目录 一 设计半加器二 半加器组成全加器三 烧录进硬件 实验目的 xff1a 通过1位全加器的详细设计 xff0c 掌握原理图输入以及Verilog的两种设计方法 软件基于quartusII 13 0版本 xff0c 开发板基于Inte
  • 关于浏览器以及各种内置浏览器造成黑屏的解决办法

    楼主在使用Chrome Edge浏览器甚至Steam时经常会发生网页还没打开就会发生 浏览器黑屏 电脑黑屏 自动重启 的过程 xff0c 困扰许久 网上的大部分教程是在浏览器设置里面关闭 硬件加速 功能 甚至于重装系统 但是经过实测 xff
  • 【FFTW库】编译生成 x86、arm 环境下的FFTW库

    FFTW是一个快速计算离散傅里叶变换的标准C语言程序集 xff0c 可计算一维或多维实和复数据以及任意规模的DFT 下面主要介绍的是 x86 环境下 FFTW库的编译过程 xff0c arm环境下的编译过程和FFTW类似 xff0c 不同之
  • C语言学习笔记w2d4

    文章目录 流程控制二循环语句gotowhile练习 do whilefor breakcontinue 作业 流程控制二 循环语句 循环的开始条件 循环的控制条件 循环的结束条件 goto 无条件跳转 xff0c 跳转到指定位置执行 xff

随机推荐