怎么查看网站是用什么系统做的,我的世界服务器网站建设,电子商务型网站建设,鞍山网页制作目录 一、UDP服务器
1、创建套接字
2、绑定套接字
3、运行
1#xff09;读取数据
2#xff09;发送数据
二、UDP客户端 创建套接字#xff1a;
客户端不用手动bind
收发数据
处理消息和网络通信解耦
三、应用场景
1、服务端执行命令
2、Windows上的客户端
3…目录 一、UDP服务器
1、创建套接字
2、绑定套接字
3、运行
1读取数据
2发送数据
二、UDP客户端 创建套接字
客户端不用手动bind
收发数据
处理消息和网络通信解耦
三、应用场景
1、服务端执行命令
2、Windows上的客户端
3、简易聊天室
四、可能遇到的问题 一、UDP服务器
1、创建套接字
int socketint domain,int type,int protocol 第一个参数表示要创建的套接字的协议家族和域是什么如下图第一个表示本地通信第二个表示IPv4的网络通信。 AF_INET也可以写成PF_INET 第二个参数表socket的类型 SOCK_STREAM:流式套接字面向字节流egTCP SOCK_DGRAM数据报套接字面向数据报egUDP 第三个参数表示协议类型填0就行 返回值文件描述符网卡设备 2、绑定套接字
int bindint sockfdconst struct sockaddr *addsocklen_t addrlen 关于第二个参数由于是网络通信所以我们要先定义一个sockaddr_in#include arpa/inet.h对象并把它的值填好。 将指定大小的数据清0 整数ip和字符串ip如何转换 同时ip也得是网络字节序。 inet_addr():将字符串ip转整数并保证其时网络字节序。 有了上面两个部分服务器就初始化成功了。 3、运行 服务器要一直运行。 客户端将数据发送给服务器后服务器进行处理再将数据返回给客户端。 1读取数据 sockfd是接收方的套接字描述符 buf是用来接收数据的。 src_addr是用来接收发送方的信息的。 flags设置为0即可 2发送数据 sockfd发送方套接字描述符 buf指向要发送的数据的缓冲区 len缓冲区大小 flags0 dest_addr接收方结构体指针 addrlen结构体大小 通过指令判断服务器是否启动 一个关于IP的问题 如果我们用自己的云服务器IP来初始化服务器会出现以下报错 云服务器禁止直接绑定公网IP。一般服务器也不会固定绑定一个IP因为每台机器可能有多个IP多个IP都可以放出去如果服务器只绑定一个IP那就只能收到发往这一个IP的消息。 bind不填IP地址就写0任意地址绑定让它根据端口号向上交付这样就可以接收本台主机发给多个IP的消息。 所以服务器就不需要ip这个字段了。 一个关于端口号的问题 【0,1023】是系统内定的端口号一般都有固定的应用层协议使用http80 https443我们要用1024及以上的端口号同时即便是1024以上某些特定端口号也建议不要使用如mysql3306…… 用命令行
下面是将服务器处理数据的部分分离出来的过程 好处代码分层上层就不用关心网络通信了。 二、UDP客户端 创建套接字 客户端不用手动bind 服务器的端口号必须是确定的因为客户端要知道服务器的IP和端口号而客户端只要保证唯一性就行。 用户需要传入服务器的ip和port 收发数据 因为客户端有可能向多个服务器发起请求那么就会有多个服务器发来响应报文所以接收消息时需要知道是谁发来的。 处理消息和网络通信解耦 function是C内置的函数对象上面这行代码定义了一个类型func_t即一个返回值为string参数为const string 的函数func_t可以作为参数类型即可将这样的一个函数作为参数传递。 也可以这样写 三、应用场景
1、服务端执行命令 1建立管道 2创建子进程让子进程程序替换执行command 补充127.0.0.1是本地环回地址走了底层的网络协议栈但并不推送到网络通常同来进行客户端和服务器的测试
2、Windows上的客户端 注意WinSock2.h要在Windows.h之前
后面的代码与Linux上基本类似
3、简易聊天室 理论上是要写一个注册登录的操作的但此处为了方便我们就直接用ip来标识每个人 如果没有出现过这个ip就将这个client添加到unordered_map里相当于进群 将消息广播 udp的socket是全双工的允许被同时读写 下面就来验证一下 之前写的客户端是要发一条消息才会收到消息这样其实就不符合我们平时群聊的逻辑接下来用多线程改一下 两个线程一个收一个发 线程要用的数据 补充关于inet_ntoa char* inet_ntoa(struct in_addr inaddr); 这个函数返回了一个char*, 很显然是这个函数自己在内部为我们申请了一块内存来保存ip的结果man手册上说, inet_ntoa函数, 是把这个返回结果放到了静态存储区. 这个时候不需要我们手动进行释放。 但如果我们多次调用这个函数结果会出现覆盖的情况 在AUPE中说这个函数不是线程安全的函数但在centos7上测试没有出现问题可能是其内部加了互斥锁因此推荐使用以下函数 const char* inet_ntop(int family,const void *addrptr,char* strptr,size_t len); 四、可能遇到的问题
1、云服务器要设置安全组开发端口号
2、登录xshell时的ip是虚拟ip要用ifconfig指令查真正的ip