D
Size: a a a
OL
LA
ПК
const
на функции как правило означает, что ее безопасно вызывать из нескольких параллельных потоков.m
const
.S
const
.m
P
AS
AS
AS
CD
AS
AF
const
.G
struct SocketInfoВнутри цикла for switch case блок который смотрит на состояния сокетов.
{
int32_t fd;
SocketStates state;
struct epoll_event event;
};
struct epoll_event * events = NULL;
...
events = (struct epoll_event *)calloc(concurrencies, sizeof(struct epoll_event));
...
while ( runStatus == 1 )
{
if ( concurrencies > 1 && avaliable_sockets > 0)
{
epoll_wait(epollfd, events, concurrencies, 0);
}
for ( sockIndex = 0; sockIndex < concurrencies; sockIndex += 1 )
{
...
}
}
typedef enum {Если STATE__CONNECT успешный
STATE__NOTHING,
STATE__CREATE,
STATE__CONNECT,
STATE__PROXY_INITIAL_SEND,
STATE__PROXY_INITIAL_RECV,
STATE__PROXY_CLIENT_SEND,
STATE__PROXY_CLIENT_RECV,
} SocketStates;
pfds[sockIndex].event.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;Если состояние STATE__<...>_SEND успешно, то я делаю
pfds[sockIndex].event.data.fd = pfds[sockIndex].fd;
epoll_ctl(epollfd, EPOLL_CTL_ADD, pfds[sockIndex].fd, &pfds[sockIndex].event);
avaliable_sockets += 1;
pfds[sockIndex].state = <STATE__NOTHING or STATE__PROXY_INITIAL_SEND>
pfds[sockIndex].state = STATE__PROXY_INITIAL_RECV;Если состояние STATE__<...>_RECV успешно, то я делаю
if ( concurrencies > 1 )
{
pfds[sockIndex].event.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
pfds[sockIndex].event.data.fd = events[sockIndex].data.fd;
epoll_ctl(epollfd, EPOLL_CTL_MOD, events[sockIndex].data.fd, &pfds[sockIndex].event);
}
pfds[sockIndex].state = STATE__PROXY_CLIENT_SEND;
if ( concurrencies > 1 )
{
pfds[sockIndex].event.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;
pfds[sockIndex].event.data.fd = events[sockIndex].data.fd;
epoll_ctl(epollfd, EPOLL_CTL_MOD, events[sockIndex].data.fd, &pfds[sockIndex].event);
}
AM