Linux阻止udp套接字将无法接收

我在ubuntu机器上打开一个udp阻塞套接字,它成功了(没有返回错误)。 当从另一台机器向该机器和端口发送数据时,接收不会破坏,并且在Wirehark嗅探器中,我看到并且Icmp错误“端口无法访问”。 我虽然它可能是一个iptables问题,并打开端口接受。 还有其他建议如何调试吗? 谢谢。 邓肯     
已邀请:
您应该显示最小的测试用例。 你看到你的过程吗?
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:%dn", 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:%dn", nread,
            inet_ntoa( cliaddr.sin_addr ),
            ntohs( cliaddr.sin_port ));
    }

    return 1;
}
查看代码中是否包含所有必需的步骤。     

要回复问题请先登录注册