我在 ubuntu 机器上打开了一个 udp 阻塞套接字,它成功了(没有返回错误)。
当从另一台机器向该机器和端口发送数据时,接收不会破坏,并且在wireshark嗅探器中我看到并且Icmp错误“端口无法访问”。
我虽然这可能是一个 iptables 问题并打开了接受的端口。
还有其他建议如何调试吗?
谢谢。
蒂米
我在 ubuntu 机器上打开了一个 udp 阻塞套接字,它成功了(没有返回错误)。
当从另一台机器向该机器和端口发送数据时,接收不会破坏,并且在wireshark嗅探器中我看到并且Icmp错误“端口无法访问”。
我虽然这可能是一个 iptables 问题并打开了接受的端口。
还有其他建议如何调试吗?
谢谢。
蒂米
我通常netcat
用来确定问题是来自网络/防火墙还是来自我自己的代码
尝试使用以下命令运行测试服务器netcat
:例如。
nc -l -u -p 9999
将打开并监听一个 udp 套接字,端口 9999。
现在您可以尝试使用从同一台计算机或另一台计算机发送数据包
nc -u <ipaddress> 9999
然后输入一些东西,看看它是否到达第一台计算机。
netcat 中还有很多其他很酷的东西,看看手册。
您是否使用bind()
正确地将套接字绑定到本地端口?
您是否记得传递本地端口号htons()
以将其转换为网络字节顺序?
返回了什么值bind()
?
你应该展示一个最小的测试用例。
你看到你的过程
sudo netstat -4lp
? 它的套接字绑定到哪个本地地址(由 netstat 报告)?
试试这个简单的服务器,看看它是否适合你:
#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;
}
查看您的代码中是否包含所有必需的步骤。