Linux网络编程——udp套接字

本章Gitee地址:udp套接字

文章目录

创建套接字

cpp 复制代码
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
  • int domain参数:表面要创建套接字的域

    c 复制代码
    Name                Purpose                          Man page
    AF_UNIX, AF_LOCAL   Local communication              unix(7)
    AF_INET             IPv4 Internet protocols          ip(7)
    AF_INET6            IPv6 Internet protocols          ipv6(7)
    AF_IPX              IPX - Novell protocols
    AF_NETLINK          Kernel user interface device     netlink(7)
    AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
    AF_AX25             Amateur radio AX.25 protocol
    AF_ATMPVC           Access to raw ATM PVCs
    AF_APPLETALK        Appletalk                        ddp(7)
    AF_PACKET           Low level packet interface       packet(7)

    我们网络通信一般是采用IPv4,即AF_INET

  • int type参数:定义的套接字类型

    Upd采用SOCK_DGRAMTcp采用SOCK_STREAM

  • int protocol参数:协议类型

    本次这里直接填0

  • 返回值:

    这里创建套接字成功之后返回新套接字的文件描述符,这本质上也是一个文件

绑定端口号

cpp 复制代码
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
  • int sockfd参数:创建套接字的返回值

  • const struct sockaddr *addr参数:网络通信,使用struct sockaddr_in进行强转,需包含头文件netinet/in.h

  • socklen_t addrlen参数:传过来结构体大小

  • 返回值

    成功返回0,失败返回-1

读取数据

cpp 复制代码
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

ssize_t recvfrom

  • int sockfd:指定的套接字

  • void *buf, size_t len:读到的数据放入缓冲区和需指定长度

  • int flagsupd默认设为0,阻塞方式

  • struct sockaddr *src_addr:对方的套接字信息

  • 返回值

    成功返回收到了多少个字节,失败返回-1

发送数据

cpp 复制代码
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

sendto,参数和发送的参数差不多


以上就是客户端的流程,需要看服务器是否跑起来,使用指令netstat -naup

-naup:能显示成数字的就显示成数字

不带n,是字符串的就是显示成字符串

aall

uudp

p:进程pid

关于IP:

对于云服务器 ,是禁止直接绑定公网ip,因为主机可能不止1一个ip,如果指定了这个ip,那么这台主机就只能收到发给这个ip的信息,所以一般都是绑定IP:0,这凡是发给这台主机的数据,都能向上交付
关于端口号:

一般0~1023都是系统内定的端口号,一般都要有固定的应用层协议使用,http:80,https:443...

所以绑定的时候,尽量绑定1024+端口号

聊天框输入框

输入输出都是显示在一个终端,我们可以将输入和输出分开,模拟聊天界面的输入区域和输出区域

目录/dev/pts,里面有各个终端文件

我们就可以尝试将上面的终端1作为输出框;终端2作为输入框

或者建立管道也行

相关推荐
wuyk5551 小时前
【Socket 进阶之路】第 3 章 TCP 三次握手 & 四次挥手深度剖析|连接建立、断开、状态机、TIME_WAIT 核心工程问题
服务器·开发语言·网络·物联网·网络协议·tcp/ip
一技安身6 小时前
【Docker】 镜像导出 & 导入,实验环境aarch64(arm64)Linux操作系统
linux·docker·容器
QYRdata7 小时前
权威数据披露:2026至2032年边缘云服务CAGR达15.6%,赛道发展驶入快车道
网络·人工智能·云计算·服务发现·边缘计算
代码村新手7 小时前
Linux调试器-gdb的使用
linux
新时代牛马8 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Riwuarua9 小时前
从近似0基础开始FPGA开发 -- part.10 verilog-ethernet开源UDP协议栈工程学习
fpga开发·udp·开源
两点王爷9 小时前
解决 Linux 中 version `CXXABI_1.3.8‘ not found 报错
linux·运维·服务器
xx~t10 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
啦啦啦啦啦zzzz10 小时前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
0+11110 小时前
Linux --线程概念与控制
linux·运维·服务器·jvm