Linux 下的 UDP 编程

2019-10-14

关键字:C 语言的 UDP 编程与实例



UDP 连接是一种无连接的网络连接协议。

Linux 下的 UDP 编程的函数接口与 TCP 差不了多远。在 UDP 通信模型中,也是以 C/S 模型来通信的。

服务端的函数调用流程主要有以下几个:

1、socket()

2、bind()

3、recvfrom() / sendto()

4、close()

客户端的函数调用流程主要有以下几个:

1、socket()

2、sendto() / recvfrom()

3、close()

socket()、bind() 函数:

略,有需要的可以参阅 TCP 编程的文章。

sendto() 函数:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

这个函数与 TCP 编程里的 send() 很像,只不过多了两个参数 dest_addr 与 addrlen 而已。由于 UDP 是无连接式的网络通信,因此很容易猜到这多出来的两个参数和数据接收方的地址有关。

参数 dest_addr 就是一个在填写时要用 sockaddr_in 结构体类型,使用时强转成 sockaddr 结构体类型的参数。用于填写数据接收方的 IP 地址、端口号与通信模式信息。

参数 addrlen 就是结构体 dest_addr 的长度。

recvfrom() 函数:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

这个函数与上面 sendto() 几乎一样。

参数 src_addr 与 addrlen 用于保存数据发送方的网络地址信息。

实例

客户端:

int main(int argc, char *argv[])
{
    int fd = -1;
    int port = 17173;

    struct sockadr_in sin;

    // 1. 创建 socket fd
    if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
        exit(-1);
    }

    bzero(&sin, sizeof(sin));

    sin.sin_family = AF_INET;
    sin.sin_port = htons(port); // host to net,本地字节序转换成网络字节序。

    if(inet_pton(AF_INET, "192.168.77.3", (void *)&sin.sin_addr) != 1)
    {
        perror("inet_pton");
        exit(-1);
    }

    char buf[64];
    while(1)
    {
        bzero(buf, 64);
        if(fgets(buf, 64 - 1, stdin) == NULL)
        {
            perror("fgets");
            continue;
        }

        sendto(fd, buf, strlen(buf), 0, (struct socketaddr *)&sin, sizeof(sin));

        //退出判断。
    }

    close(fd);

    return 0;
}

服务端:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>

int main()
{
    int fd = -1;
    struct sockaddr_in sin;

    if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
        exit(-1);
    }

    //允许绑定地址与端口的快速重用。
    int b_reuse = 1;
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(int));

    sin.sin_addr.s_addr = htonl(INADDR_ANY);

    if(bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
    {
        perror("bind");
        exit(-1);
    }

    char buf[64];
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);
    while(1)
    {
        bzero(buf, 64);
        if(recvfrom(fd, buf, 64 - 1, 0, (struct sockaddr *)&cin, &addrlen) < 0)
        {
            perror("recvfrom");
            continue;
        }

        char ipv4[16];
        if(!inet_ntop(AF_INET, (void *)&cin.sin_addr, ipv4, sizeof(cin)))
        {
            perror("inet_ntop");
            exit(-1);
        }

        printf("received from(%s:%d), data:%s\n", ipv4, ntohs(sin.sin_port), buf);

    }

    return 0;
}


Linux 下的 UDP 编程

原文地址:https://www.cnblogs.com/chorm590/p/11638422.html

时间: 2024-10-06 20:47:38

Linux 下的 UDP 编程的相关文章

基于Linux下的UDP编程

一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: Ø  建立套接字 Ø  将套接字地址结构进行绑定 Ø  读写数据 Ø  关闭套接字 2.客户端程序包括: Ø  建立套接字 Ø  读写数据 Ø  关闭套接字 3.服务器端和客户端程序之间的差别 服务器端和客户端两个流程之间的主要差别在于对地址的绑定函数(bind()函数),而客户端可以不用进行地址和端口的绑定操作. 二.Linux中UDP套接字函数  从图可知,UDP协议的服务端程序

Linux下C++的编程——开偏介绍

C++是一个功能强大而又应用广泛的计算机语言,就应用领域而言,几乎无所不在,因为有操作系统的地方就会有C++的存在,热门程序而言,也就仅次于C和Java.而C与C++又有天然的血缘关系. 从事C++开发近两年,虽然开发的产品都是跨平台的,但个人直接接触到的编程工程还是更偏重于Windows平台(至少开发环境更多的是在Windows平台,还写过"带你玩转Visual Studio"系列的博文),而现在要自己独立地带领一个项目的开发,还是一个跨平台的项目,也就有必要到Linux下C++的编

Linux下C++的编程——开发环境搭建与第一个程序

上一篇文章Linux下C++的编程--开偏介绍中我们已经介绍了GUN.GCC.G++等一些重要的概念,现在应该开始动手实践了! 开发工具的安装 环境 Distributions版本:CentOS 6.7 Linux内核片:2.6.32-573.3.1.el6.i686 一般Linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号检查gcc和g++是否已经安装. [luowf@luoweifu ~]$ gcc -v gcc

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

Linux下C++的编程——GDB进行程序调试

GDB简介 我们在Linux下C++的编程--开偏介绍一文中已经简单介绍了GDB的功能,是类Unix系统的主要调试工具,可进行断点调试,跟踪程序,动态改变执行环境等功能. 从一个程序开始调试 下面我们就从一个程序开始讲解一下GDB的简单用法.假设我们有如下的程序: GDBTest1.cpp #include <iostream> int Accumulation(int n) { int result = 0; for(int i = 0; i < n; i ++) { result +

Linux下的shell编程入门

通常情况下,我们从命令行输入命令每输入一次就能够得到系统的一次响应.一旦需要我们一个接着一个的输入命令而最后才得到结果的时候,这样的做法显然就没有效率.要达到这样的目的,通常我们利用shell程序或者shell脚本来实现. 一.简介 Shell编程有很多类似C语言和其他程序语言的特征,但是又没有编程语言那样复杂.Shell程序就是放在一个文件中的一系列Linux命令和实用程序,在执行的时候,通过Linux一个接着一个地解释和执行每个命令. 下面我们来看一个简单的shell程序: 1.首先建立一个

linux下的bash编程简要学习

linux下的bash编程简要学习     1.bash是什么: linux运行时系统只会运行系统运行所需要的运行脚本即系统守护进程,一般根据用户自己需求设定和实现的服务需要手动启动,这种服务进程通常由bash启动,脚本中的命令通常被按照一定规则被bash读取视作参数,因此在脚本头部要申明运行的bash类型,bash命令分为内建命令及外部命令,外部命令通过PATH进行依次查找. bash读取命令后将其启动(fork)成为一个进程,依次启动服务     2.bash控制语句:         本地

Linux 下IO端口编程访问

以前写的一篇笔记,偶尔翻出来了,放在这里做个纪念 Linux 下IO端口编程访问 这里记录的方法是在用户态访问IO端口,不涉及驱动程序的编写. 首先要包含头文件 /usr/include/asm/io.h ioperm() 在 unistd.h 中声明.用来打开对IO端口的访问权限,要求程序执行时必须有root 权限.只可以打开0x00到0x3ff 这一地址段的IO端口. ioperm( from, num, turn_on) 比如: #include<asm/io.h> #include&l

Linux下C语言编程基础学习记录

VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s文件转化为*.o的二进制目标代码文件. 链接阶段:将*.o文件转化为可执行文件. 生成可执行文件:将*.o转换为可执行文件. 执行可执行C语言文件. gcc常用选项列表 -c      只编译不链接,生成目标文件“.o” -S      只编译不汇编,生成编码代码 -E      只进行预编译,不做