本章Gitee地址:udp套接字
文章目录
- 创建套接字
- 绑定端口号
- 读取数据
- 发送数据
- 聊天框输入框
创建套接字
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
-
int domain参数:表面要创建套接字的域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_DGRAM,Tcp采用SOCK_STREAM -
int protocol参数:协议类型本次这里直接填
0 -
返回值:

这里创建套接字成功之后返回新套接字的文件描述符,这本质上也是一个文件
绑定端口号
#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
读取数据
#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 flags:upd默认设为0,阻塞方式 -
struct sockaddr *src_addr:对方的套接字信息 -
返回值

成功返回收到了多少个字节,失败返回
-1
发送数据
#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,是字符串的就是显示成字符串
a:all
u:udp
p:进程pid

关于IP:
对于云服务器,是禁止直接绑定公网
ip,因为主机可能不止1一个ip,如果指定了这个ip,那么这台主机就只能收到发给这个ip的信息,所以一般都是绑定IP:0,这凡是发给这台主机的数据,都能向上交付
关于端口号:
一般
0~1023都是系统内定的端口号,一般都要有固定的应用层协议使用,http:80,https:443…所以绑定的时候,尽量绑定1024+端口号
聊天框输入框
输入输出都是显示在一个终端,我们可以将输入和输出分开,模拟聊天界面的输入区域和输出区域
目录/dev/pts,里面有各个终端文件

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

或者建立管道也行
