本章Gitee地址:udp套接字
文章目录
创建套接字
cpp
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
-
int domain
参数:表面要创建套接字的域cName 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
-
返回值:
这里创建套接字成功之后返回新套接字的文件描述符,这本质上也是一个文件
绑定端口号
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 flags
:upd
默认设为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
,是字符串的就是显示成字符串
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
作为输入框
或者建立管道也行