[网络] UDP通信接口及一些简易项目
本文只是介绍Udp通信接口,并不涉及底层原理
UDP直译是用户数据报协议,是一种很重要的网络通信协议
首先,头文件
#include <sys/types.h>
#include <sys/socket.h>
socket接口
int socket(int domain, int type, int protocol);
三个参数:
第一个参数domain 代表网络类型,常用的比如AF_UNIX,用于本地通信,AF_INET,用于IPV4网络通信,AF_INET6用于IPV6网络通信,
第二个参数type 套接字类型,也就是具体的通信类型,常用的SOCK_DGRAM 创建一个面向数据报的套接字,;SOCK_STREAM,创建一个面向字节流的套接字
第三个参数protocol 具体的通信协议,一般设置成0
返回值 返回一个文件fd,通过这个文件来进行网络通信
socket相当于建立了一个通信场景
使用
int sockfd = ::socket(AF_INET, SOCK_DGRAM, 0);
bind接口
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
第一个参数是socket的返回值.
第二个参数是一个代表通信目标
第三个参数是第二个参数的长度
成功返回0,失败-1
bind
函数的作用是将一个套接字与一个本地地址(包括IP地址和端口号)绑定,使得该套接字只能在该地址上接收数据。对于服务器端的套接字来说,这一步是必要的,因为它需要监听来自客户端的连接请求。对于客户端的套接字来说,bind
通常不是必需的,因为客户端可以在任何可用的端口上发送数据。请注意它和function头文件里的bind重名
::bind Linux下网络通信
std::bind C++函数参数重新绑定
// 2.bind
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(8888);
local.sin_addr.s_addr = INADDR_ANY; // 服务器端,进行任意IP地址绑定
int n = ::bind(_sockfd, (struct sockaddr *)&local, sizeof(local));eof(local));
recvform接口
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
flags取 0
这个接口用于从指定udp文件fd中读,第五个参数是输出型参数,发送方的ip+port,用于反向发送数据
char inbuffer[1024];
struct sockaddr_in peer;
socklen_t len = sizeof(peer);
int n = recvfrom(_sockfd, inbuffer, sizeof(inbuffer) - 1, 0, (struct sockaddr *)&peer, &len);
sendto接口
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
flags 取 0
这个接口是用来发数据的,第5个参数是目标ip+端口号
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(ip.c_str());
server.sin_port = port;
std::getline(std::cin, line);
int n = sendto(sockfd, line.c_str(), line.size(), 0, (struct sockaddr *)&server, sizeof(server));
3个简单的小项目
linux/网络/1.udp · 阿巴啊巴DDDD/计算机学 - 码云 - 开源中国