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作为输入框

或者建立管道也行

相关推荐
A小辣椒18 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
网络研究院3 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展