关于epoll,请看上一篇文章: epoll详解
本代码包含三个文件:
utility.h
client.cpp
server.cpp
可实现局域网内多主机异步通信
下面是效果图:
1. 开启服务端:
2. 开启两个客户端:
客户端1:
客户端2:
服务端的提示消息:
3. 消息传送:
客户端1:
客户端2:
服务端的提示消息并广播:
代码:
//utility.h
#ifndef UTILITY_H_INCLUDED
#define UTILITY_H_INCLUDED
#include <iostream>
#include <list>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
// 选用list方便删除sockfd
list<int> clients_list;
// ip
#define SERVER_IP "192.168.1.193"
//桥接后在同一网段即可选用以下地址
//#define CLIENT_IP "192.168.1.XXX"
// server port
#define SERVER_PORT 8888
//epoll 支持的最大并发量
#define EPOLL_SIZE 5000
//message buffer size
#define BUF_SIZE 0xFFFF
#define SERVER_WELCOME "Welcome you join to the chat room! Your chat ID is: Client #%d"
#define SERVER_MESSAGE "ClientID %d say >> %s"
// exit
#define EXIT "EXIT"
#define CAUTION "There is only one int the char room!"
//设置sockfd,pipefd非阻塞
int setnonblocking(int sockfd)
{
fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)| O_NONBLOCK);
return 0;
}
/**
* @param epollfd: epoll handle
* @param fd: socket descriptor
* @param enable_et : enable_et = true, epoll use ET; otherwise LT
**/
void addfd( int epollfd, int fd, bool enable_et )
{
struct epoll_event ev