Я новичок в Си, и мой маленький проект - написать простой прокси SOCKS4.Благодаря помощи здесь я до сих пор использовал неблокирующие сокеты и poll () для своей рутины.Однако на данный момент у меня, кажется, есть 2 проблемы:
Исходящий Socket dstSocket не закрывается, если входящий Socket rcvSocket закрывается, и наоборот.Я не проверяю это в цикле, но я не знаю как.Я попробовал POLLHUP как реванш, но, похоже, это не сработало.Нормальная проверка, кажется, возвращает ли recv () 0, но это также верно для неблокирующих сокетов?И если да, то как это работает с реваншами, я не могу понять, где бы это поставить, так как если бы POLLIN |POLLPRI установлены мне кажется recv () никогда не должен возвращать 0?Кроме того, я не понимаю, в чем точная разница между POLLIN и POLLPRI, мне кажется, просто проверка "данные доступны для чтения" в любом случае?
Прокси, кажется, работаетдля соединений я тестировал с Netcat.Однако, если я использую браузер, он говорит (когда я нацеливаюсь на веб-сайт), хочу ли я сохранить «двоичные данные».Я проверил данные в wireshark, и то, что получено с сервера, корректно пересылается клиенту побайтно.Если у кого-то может быть идея, почему это может произойти с этой программой, было бы неплохо:)
Прикреплен соответствующий код (будьте осторожны, программист, новичок):
fds[1].fd = dstSocket;
fds[0].fd = rcvSocket;
fds[1].events = POLLIN | POLLPRI | POLLHUP;
fds[0].events = POLLIN | POLLPRI | POLLHUP;
timer = poll(fds, 2, timeout_msecs); /* i dont use this yet */
fcntl(rcvSocket, F_SETFL, O_NONBLOCK);
fcntl(dstSocket, F_SETFL, O_NONBLOCK);
while (1 == 1)
{
if (fds[0].revents & POLLIN | POLLPRI)
{
recvMsgSize = recv(rcvSocket, rcvBuffer, RCVBUFSIZE, 0);
if (recvMsgSize > 0) {send(dstSocket, rcvBuffer, recvMsgSize, 0);}
}
if (fds[1].revents & POLLIN | POLLPRI)
{
sndMsgSize = recv(dstSocket, sndBuffer, RCVBUFSIZE, 0);
if (sndMsgSize > 0) { send(rcvSocket, sndBuffer, sndMsgSize, 0);}
}
if ((fds[0].revents & POLLHUP) || (fds[1].revents & POLLHUP))
{
close(rcvSocket);
close(dstSocket);
}
}