Linux, блокирующий сокет udp, не получит - PullRequest
2 голосов
/ 04 июля 2010

Я открываю сокет блокировки udp на компьютере с Ubuntu, он проходит успешно (ошибки не возвращаются).

При отправке данных на этот компьютер и через порт с другого компьютера прием не нарушается и в анализаторе WiresharkЯ вижу, и Icmp ошибка "Порт недоступен".

Я, хотя это может быть проблема Iptables и открыл порт для принятия.

Любые другие предложения, как отладить это?

Спасибо.

Тимми

Ответы [ 4 ]

4 голосов
/ 04 июля 2010

Я обычно использую netcat, чтобы выяснить, связана ли проблема с сетью / брандмауэром или с моим собственным кодом

, попробуйте запустить тестовый сервер с netcat: например,

nc -l -u -p 9999 

откроет и прослушает сокет udp, порт 9999.

Теперь вы можете попытаться отправить пакет с того же или с другого компьютера, используя

nc -u <ipaddress> 9999

Затем введите что-нибудь и увидитеесли он достигнет первого компьютера.

В netcat есть много других интересных вещей, посмотрите руководство.

2 голосов
/ 04 июля 2010

Используете ли вы bind() для правильной привязки сокета к локальному порту?

Вы не забыли передать номер локального порта через htons() для преобразования его в сетевой порядок байтов?

Какое значение bind() вернуло?

1 голос
/ 04 июля 2010

Вы должны показать минимальный контрольный пример.

Видите ли вы ваш процесс в

sudo netstat -4lp

? С каким локальным адресом связан его сокет (как сообщает netstat)?

0 голосов
/ 04 июля 2010

Попробуйте этот простой сервер и посмотрите, работает ли он у вас:

#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;
}

Проверьте, есть ли в вашем коде все необходимые шаги.

...