记在此处,怕给忘记了
#include <iostream>
#include <vector>
#include <sys/types.h>
#include <sys/un.h> // struct sockaddr_un
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <sys/time.h> // gettimeofday()
#include <netinet/in.h> // struct in_addr
#include <arpa/inet.h> // inet_aton()
#include <unistd.h> // getpid()
#include <signal.h>
#include <fcntl.h>
#include <cerrno>
using namespace std;
#define MAX_CONNECT 10
void nothing(int i)
{
cerr << "signal: " << i << endl;
}
void rmsocket(int)
{
unlink("/home/whh/fym/gcc/c"); //bind(): Address already in use
}
int main()
{
int nconn = 0;
int nacc = 0;
bool maxconn = false;
signal(SIGINT,rmsocket);
int n;
cout << getpid() << endl;
char buf[BUFSIZ];
struct sockaddr_un addr;
struct sockaddr_un cli_addr;
socklen_t cli_len = sizeof cli_addr;
memset(&addr,0,sizeof addr);
short port;
int fd = socket(PF_UNIX,SOCK_STREAM,0);
if(fd < 0)
{
perror("socket()");
return 1;
}
int flags = fcntl(fd,F_GETFL,0);
flags |= O_NONBLOCK;
//fcntl(fd,F_SETFL,flags);
addr.sun_family = AF_UNIX;
unlink("/home/whh/fym/gcc/c");
strcpy(addr.sun_path,"/home/whh/fym/gcc/c");
n = bind(fd,(struct sockaddr*) &addr,sizeof(addr));
if(n < 0)
{ //如果addr.sun_path所指的路径已经存在,则出错
perror("bind()"); //Address already in use.
return 2;
}
n = listen(fd,2);
if(n < 0)
{
perror("listen()");
return 3;
}
vector<int> fdvec;
fdvec.push_back(fd);
struct epoll_event ev = {0};
int kfd = epoll_create(MAX_CONNECT+1);
if(kfd < 0)
{
perror("epoll_create");
return 4;
}
ev.data.fd = fd;
ev.events = EPOLLIN | EPOLLET;
n = epoll_ctl(kfd,EPOLL_CTL_ADD,fd,&ev);
if(n < 0)
{
perror("epoll_ctl()");
return 5;
}
while(1)
{
struct epoll_event events[20];
memset(events,0,sizeof events);
cerr << "epoll_wait..." << "total:" << nconn;
n = epoll_wait(kfd,events,MAX_CONNECT+1,-1);
cerr << " Done. "<<n<<endl;
if(n < 0)
{
perror("epoll_wait");
return 6;
}
else if(0 == n)
{
cout << "Timeout." << endl;
continue;
}
else
{
for(int i=0; i<n; ++i)
{
if(events[i].data.fd == fd)
{ // accept
int newfd = accept(fd,(struct sockaddr*)&cli_addr,&cli_len);
cerr << "accept:" << newfd << endl;
if(newfd < 0)
{
perror("accept()");
return 5;
}
ev.data.fd = newfd;
ev.events = EPOLLIN | EPOLLET;
epoll_ctl(kfd,EPOLL_CTL_ADD,newfd,&ev);
if(++nconn >= MAX_CONNECT)
{
ev.data.fd = fd;
epoll_ctl(kfd,EPOLL_CTL_DEL,fd,&ev);
maxconn = true;
}
}
else if(events[i].events & EPOLLIN)
{ // read
char buf[BUFSIZ] = {0};
int n = read(events[i].data.fd,buf,sizeof(buf));
cerr << "read " <<n<<"bytes"<<endl;
if(n < 0)
{
perror("read()");
if(EINTR == errno)
{
continue;
}
return 6;
}
if(0 == n)
{ // client closed or network down.
close(events[i].data.fd);
--nconn;
if(maxconn)
{
maxconn = false;
ev.data.fd = fd;
ev.events = EPOLLIN | EPOLLET;
epoll_ctl(kfd,EPOLL_CTL_ADD,fd,&ev);
}
continue;
}
int m = write(events[i].data.fd,buf,n);
if(m < 0)
{
perror("write()");
return 7;
}
}
} // for.
}
} //while(1)
return 0;
}