Я пытаюсь преобразовать программу под названием Responder
, написанную на Python, в версию на C. Одно из мест, на котором я застрял, — это слушатели, которые прослушивают разные порты. Responder прослушивает SMB на портах 445 и 139. Я создал небольшой фрагмент, который также будет прослушивать эти порты. Но когда я запускаю свою программу, я не получаю никаких данных.
void sniff(int PORT) {
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
if ((server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0) {
return;
}
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
return;
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
return;
}
if (listen(server_fd, 3) < 0) {
return;
}
printf("listen done.\n");
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
return;
}
valread = read( server_fd , buffer, 1024);
printf("%s\n",buffer );
return;
}
Если я сделаю все вышеперечисленное, я ничего не получу.
Что вы уже сделали для его отладки? Я предполагаю, что у вас есть отладчик, и вы можете устанавливать точки останова, шагать, писать операторы печати, чтобы показать, как выполняется программа и какие данные находятся в разных точках и т. д.
Приведенный выше код будет зависать в функции accept. Насколько я понимаю, с ним ничего не связано, что имеет смысл. Я специально пытаюсь снифферить все, что вижу в своем интерфейсе, как это делает Wireshark.
Если ничего не подключается, accept должен блокироваться до тех пор, пока соединение не будет установлено. Это не зависание программы; это определенное поведение accept. Поэтому я не уверен, какое другое поведение вы ожидаете.
@ vs123 Этот код создает TCP-сервер, который ожидает подключения к нему клиентов. Если вы пытаетесь вместо этого написать анализатор пакетов, вам нужно вместо этого использовать сокет
AF_PACKET
, при необходимости перевести в неразборчивый режим черезsetsockopt()
и использоватьrecvfrom()
илиrecvmsg()
для чтения пакетов, проходящих через сеть. Дополнительные сведения см. в разделе Захват кадров Ethernet с использованием сокета AF_PACKET в C.