发送
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_addr.s_addr = inet_addr(ip);
servaddr.sin_port = htons(port);
servaddr.sin_family = AF_INET;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sock) {
return false;
puts("Failed to create socket");
}
ssize_t send_size =sendto(sock, packet, packet_size, 0, (const struct sockaddr*)&servaddr,sizeof(servaddr));
close(sock);
接收(epoll)
int eq = epoll_create(1024);
int fd = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
address.sin_port = htons(port);
if (bind(fd, (sockaddr*)&address, sizeof(sockaddr)) != 0) {
printf("bind failed, errno is %d\n", errno);
return -1;
}
- 初始化epoll_event,添加对应的socket_fd,如果想监听多个端口,可创建多个fd,使用epoll_ctl将fd逐一加入到event
struct epoll_event evt = {0, {0}};
evt.events = EPOLLIN;
evt.data.fd = fd;
if (epoll_ctl(eq, EPOLL_CTL_ADD, fd, &evt) != 0) {
return -1;
}
epoll_event active_querys[1024];
- 开始无限循环
- 进入阻塞,等待消息传入,当有数据包到达时被唤醒,count为数据包数量
int count = epoll_wait(eq, active_querys, 1024, -1);
- 根据count数量进行相应次数的处理。其中active_querys前count位就是有新数据包到达的socket对应的event
for (int i = 0; i < count; i++) {
epoll_event evt = active_querys[i];
if (evt.data.fd == fd) {
char buf[1024] = {0};
ssize_t size = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
if (size == -1) {
printf("recvfrom failed, errno is %d\n", errno);
}
}