Linux TCP-сервер: чтение IP-адреса клиента перед принятием соединения - PullRequest
5 голосов
/ 21 июня 2011

Похожие: C ++ Winsock API, как получить IP-адрес клиента для подключения, прежде чем принимать соединение?

Привет, когда вы запускаетеTCP-сервер (написанный на C и использующий API-интерфейс Berkeley Socket), можно ли прочитать IP-адрес / порт клиента перед тем, как принимать соединение?

Насколько я знаю, вам нужно accept сначала соединение и shutdown непосредственно после него, если вы не хотите связываться с данным клиентом из-за его IP-адреса.

Псевдокод (яищем peek и refuse метод):

 int serverfd = listen(...);
 for(;;) {
     struct sockaddr_in clientAddr;
     peek(serverfd, &clientAddr, sizeof(clientAddr));
     if(isLegit(&clientAddr)) {
         int clientfd = accept(serverfd, &clientAddr, sizeof(clientAddr));
         handleClient(clientfd);
     } else {
         refuse(serverfd, &clientAddr, sizeof(clientAddr));
     }
 }

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Я думаю, что вы пытаетесь предотвратить возникновение TCP-согласования, если оно соответствует определенному IP-адресу.Насколько я знаю, это невозможно на уровне сокетов.Будет выполнено согласование TCP, и к тому времени, когда вы примете прием сокета, согласование уже произошло.

Технически возможно, что вы могли бы как-то взглянуть на эту информацию о состоянии, но она не будет делать то, что вы ожидаете.Прием сокета - это интерфейс между ядром, которое уже выполнило свою работу, и вашей программой, которая хотела бы прочитать данные.Самое простое, что нужно сделать - это принять сокет и загрузить его, если он вам не нужен.

Если вы хотите предотвратить в первую очередь согласование TCP, вам нужно использовать iptables.

1 голос
/ 21 июня 2011

Нет такого API для сокетов TCP с BSD. Предложения: используйте tcp-wrappers или iptables, чтобы сделать тяжелую работу. Один из них более автоматический, чем другой.

UDP позволяет вам использовать MSG_PEEK, который может позволить вам увидеть, откуда он, с помощью recvfrom, но вам все равно придется считывать пакет, так что это не победа.

...