我正在Ubuntu机器上打开UDP阻止套接字,它将成功(未返回错误)。

从另一台计算机将数据发送到该计算机和端口时,接收不会漏洞,在Wireshark的嗅探器中,我看到的是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:%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;
}

查看您的代码中是否存在所有必需的步骤。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top