用UDP套接字实现客户端和服务端通信 |
您所在的位置:网站首页 › udp链接失败 › 用UDP套接字实现客户端和服务端通信 |
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 |