Linux Blacking UDP сокет не будет получать
-
02-10-2019 - |
Вопрос
Я открываю разъем блокировки UDP на машине Ubuntu, он идет успешно (ошибки не возвращаются).
При отправке данных на этот компьютер и порт с другой машины получают не пробивы и в проволоке Sniffer, который я вижу, и ICMP Ошибка «Порт недостигаю».
Я хотя это может быть проблемой iptables и открыла порт для принятия.
Любые другие предложения Как отладить это?
Спасибо.
Timmy.
Решение
Вы должны показать минимальный тестовый случай.
Вы видите свой процесс в
sudo netstat -4lp
? Какой локальный адрес является его сокет для (как сообщает Netstat)?
Другие советы
Я обычно использую netcat
Чтобы выяснить, возникает ли проблема из сети / брандмауэра или из моего собственного кода
попробуйте запустить тестовый сервер с netcat
: например.
nc -l -u -p 9999
Откроется и слушаю гнездо UDP, порт 9999.
Теперь вы можете попытаться отправить пакет из того же или с другого компьютера, используя
nc -u <ipaddress> 9999
Затем введите что-нибудь и посмотрите, достигнет ли он первого компьютера.
В Netcat много других прохладных веществ, посмотрите на руководство.
Ты используешь bind()
Чтобы правильно связать разъем к локальному порту?
Вы помнили, чтобы пройти номер локального порта через htons()
Чтобы преобразовать его в сетевой байтовый заказ?
Какое значение сделало bind()
вернуть?
Попробуйте этот простой сервер и посмотрите, работает ли он для вас:
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFSZ 4096
#define PORTNUM 1099
char buffer[BUFSZ];
int main( int argc, char* argv[] )
{
int fd;
struct sockaddr_in servaddr, cliaddr;
socklen_t clilen = sizeof( cliaddr );
ssize_t nread;
if (( fd = socket( AF_INET, SOCK_DGRAM, 0 )) == -1 )
err( 1, "socket" );
bzero( &cliaddr, sizeof( cliaddr ));
bzero( &servaddr, sizeof( servaddr ));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
servaddr.sin_port = htons( PORTNUM );
if ( bind( fd, ( struct sockaddr* )&servaddr, sizeof( servaddr )) == -1 )
err( 1, "bind" );
printf( "bound to %s:%d\n", inet_ntoa( servaddr.sin_addr ),
ntohs( servaddr.sin_port ));
while (( nread = recvfrom( fd, buffer, BUFSZ, 0,
( struct sockaddr* )&cliaddr, &clilen )) != -1 )
{
printf( "received %lu bytes from %s:%d\n", nread,
inet_ntoa( cliaddr.sin_addr ),
ntohs( cliaddr.sin_port ));
}
return 1;
}
Посмотрите, есть ли все необходимые шаги в вашем коде.