LINUX.ORG.RU

в гугле чтоль зобанили? Или маны не завезли? там же даже пример эхо сервера есть.

anonymous
()
Ответ на: комментарий от anonymous

Смотрел, но что-то всё не то... Может скинете годный примерчик?

sitev_ru
() автор топика

Как-то так должно работать

#include <cstdlib>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <fcntl.h>

const unsigned int max_events = 10;

void set_nonblocking(int fd){
  int flags;
  flags = fcntl(fd, F_GETFL);
  fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}

void bind_socket(int fd, int port, int addr){
  sockaddr_in addr_in;
  addr_in.sin_family = AF_INET;
  addr_in.sin_port = htons(port);
  addr_in.sin_addr.s_addr = htonl(addr);
  bind(fd, (sockaddr*)&addr_in, sizeof(addr_in));
}

int main(){
  int server_socket;
  int epoll_fd;
  epoll_event ev;
  epoll_event events[max_events];

  server_socket = socket(AF_INET, SOCK_STREAM, 0);
  set_nonblocking(server_socket);
  bind_socket(server_socket, 8000, INADDR_ANY);
  
  epoll_fd = epoll_create1(0);
  ev.events = EPOLLET | EPOLLIN;
  ev.data.fd = server_socket;
  epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_socket,&ev);
  listen(server_socket, SOMAXCONN);

  while(true){
    int num_events;
    int n;

    num_events = epoll_wait(epoll_fd, events, max_events, -1);
    for(n = 0; n < num_events; n++){
      if(events[n].data.fd == server_socket){
	int client_socket;
	client_socket = accept(server_socket, nullptr, nullptr);
        //Вот тут пишешь свою логику
	close(client_socket);
      }
    }
  }
  
  close(epoll_fd);
  close(server_socket);

  return EXIT_SUCCESS;
}

userd
()
18 мая 2018 г.

Под windows я отлавливал событие FD_CONNECT. Здесь такого, почему то, не нашёл. Как всё-таки поймать epoll connect?

  1. создаешь сокет
  2. переводишь в неблокирующий режим
  3. зовешь connect
  4. если connect == -1 && errno == EAGAIN, ждешь, когда сокет станет writable; в отличие от send/recv, повторно звать connect больше не нужно
  5. пытаешься понять, все хорошо или все плохо, вытаскивая код ошибки из сокета по getsockopt

За примером в гугл.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.