用UDP套接字实现客户端和服务端通信

您所在的位置:网站首页 udp链接失败 用UDP套接字实现客户端和服务端通信

用UDP套接字实现客户端和服务端通信

2023-06-29 13:09| 来源: 网络整理| 查看: 265

IP地址和port端口号 IP地址

数据有IP(公网)标识一台唯一的主机。

port端口号

为了更好的标识一台主机上服务进程的唯一性,我们采用端口号port,标识服务器进程,客户端进程的唯一性!

ip+端口号

IP地址(主机全网唯一性) + 该主机上的端口号,标识该服务器上进程的唯一性 ipA + portA, ipB + portB

网络通信的本质 概述

相当于一个服务端进程 与一个客户端进程 通过网络资源来进行通信

本质

1. 需要让不同的进程,先看到同一份资源 -- 网络

2. 通信不就是在做IO吗? -- 所以,我们所有的上网行为,无外乎两种:     a. 我要把我的数据发出去。    b. 我要收到别人给我发的数据。

为什么不用PID做端口号?

a. 系统是系统,网络是网络,单独设置 -- 系统与网络解耦 b. 需要客户端每次都能找到服务器进程 -- 服务器的唯一性不能做任何改变 -- IP+port 不能随便改变 点分十进制风格的IP,字符串,可读性好

uint32_t ip:整数风格的IP - 网络通信使用

uint32_t ip=12345;

struct _ip {    unsigned char p1;    unsigned char p2;    unsigned char p3;    unsigned char p4; };

str_ip= to_string(((struct _ip)&ip)->p1)+"." to_string(((struct _ip)&ip)->p2)+"." to_string(((struct _ip)&ip)->p3)+"." to_string(((struct _ip)&ip)->p4);

系统接口可以直接对点分十进制和uint32_t类型的IP地址进行互相转换。

bzero接口 #include void bzero(void *s, size_t n);

作用:初始化结构体类型的对象。

inet_addr接口 (用于ip地址) #include #include #include in_addr_t inet_addr(const char *cp); 内部完成两件事情

1. string -> uint32_t 2. htonl();

服务器ip的设置

一般情况下我们的服务器不指明一个特定的IP,一般会设置成INADDR_ANY。

任意地址bind,这样的话就不会错过其他不同的IP但是端口号与我们的服务器匹配的网络。 

struct sockaddr_in local; // 定义一个sockaddr_in的结构体 local.sin_addr.s_addr = INADDR_ANY; // 不指名特定的一个IP  recvfrom接口 #include #include ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr, socklen_t *addrlen); 参数 flags

设置为0  为阻塞式读取

struct sockaddr *src_addr 

所传的结构体

socklen_t *addrlen

所传的结构体长度

返回值

读取成功返回读取到的字符数。 读取失败返回-1。

inet_ntoa 接口 #include #include #include char *inet_ntoa(struct in_addr in); 作用

1. 将网络序列转换为主机序列  2. 并且将int转为点分十进制

为什么客户端不用显示的bind?

因为写服务器的是一家公司,但是写客户端的是无数家公司。如果我们在客户端上绑定了特定的端口号,如果刚好这个端口号被别人占用了,那么就无法与服务器正常通信了。因此服务端是一定要我们手动去bind特定的端口号的,为了服务端端口号的唯一。客户端的端口号我们让OS自动形成就可以了。

sendto接口 #include #include ssize_t sendto(int sockfd, const void *buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen); 参数 const void *buf

要发送的缓冲区

size_t len

缓冲区长度

UDP通信的代码 简单的通信

客户端发数据,服务端接收数据。

服务端代码 创建套接字 // 1. 套接字的创建 _sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (_sockfd == -1) { cerr


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3