UDP 接收错误:连接被拒绝

Posted

技术标签:

【中文标题】UDP 接收错误:连接被拒绝【英文标题】:Error receiving in UDP: Connection refused 【发布时间】:2011-01-23 06:18:20 【问题描述】:

我正在尝试通过特定端口中的 UDP 向服务器发送字符串 HI,然后接收响应。但是,在我尝试使用 recvfrom() 获得响应后,我陷入了阻塞状态。我尝试使用连接的 UDP,但我得到了:

在 UDP 中接收错误:连接被拒绝

这可能是什么原因?服务器不在我的控制之下,但我知道它工作正常。

我已经添加了代码

int sockfdudp;
char bufudp[MAXDATASIZE], port[6];
struct addrinfo hints, *servinfo, *p;
struct sockaddr_storage addr;   
int rv;
char s[INET6_ADDRSTRLEN];
int bytes_recv, bytes_sent;
socklen_t len;

scanf("%s",port);
printf("UDP Port: %s \n", port);

// Start connecting to datagram server  
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;

if ((rv = getaddrinfo(SERVER_NAME, port, &hints, &servinfo)) != 0) 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
    return 1;


// loop through all the results and make a socket
for(p = servinfo; p != NULL; p = p->ai_next) 
    if ((sockfdudp = socket(p->ai_family, p->ai_socktype,
            p->ai_protocol)) == -1) 
        perror("Creating datagram socket");
        continue;
    

if (connect(sockfdudp, p->ai_addr, p->ai_addrlen) == -1) 
        close(sockfdudp);
        perror("Connecting stream socket");
        continue;
    
    break;


if (p == NULL) 
    fprintf(stderr, "ClientUDP: failed to bind socket\n");
    return 2;



freeaddrinfo(servinfo);

if ((bytes_sent = sendto(sockfdudp, UDP_MSG, strlen(UDP_MSG), 0, p->ai_addr, p->ai_addrlen)) == -1) 
    perror("ClientUDP: Error sending data");
    exit(1);

printf("Data %s sent\n", UDP_MSG );     

len = sizeof(struct sockaddr_storage);

if ((bytes_recv = recvfrom(sockfdudp, bufudp, MAXDATASIZE-1, 0,(struct sockaddr*)&addr, &len)) == -1) 
    perror("Error receiving in UDP");
    exit(1);


printf("Bytes recv %d\n", bytes_recv);  

bufudp[bytes_recv] = '\0';

printf("ClientUDP: Received\n %s \n",bufudp );    

close(sockfdudp);

return 0;

【问题讨论】:

由于recvfrom 将阻塞直到套接字上的消息可用,您确定服务器正在响应您的消息吗? Server Fault 有一个关于 Connection Refused 的规范问题。 【参考方案1】:

您可能正在向不在该特定端口上侦听的服务器发送某些内容。 这将导致发送回 icmp 消息,并且在您连接套接字的情况下,您的下一个 recvfrom 将返回错误。

使用 tcpdump 或 wireshark 检查线路上发生了什么。

【讨论】:

这是正确的答案——来自recvfrom 的“连接被拒绝”很可能是由于服务器对初始 UDP 请求返回 ICMP“端口不可达”响应造成的。 我的wireshark绝对同意:-)【参考方案2】:

我的猜测是你的 ip 地址不正确,或者端口已经在使用中。 UDP 是无连接的,因此确实没有任何“连接”失败。

【讨论】:

我发送的初始化为常量#define UDP_MSG "HI" 的UDP_MSG 是否有任何原因是错误的?它需要正确发送才能从服务器返回任何响应。 嗯...UDP 本身有一个 最小 消息大小,但我想 Sockets 层会处理这个问题。

以上是关于UDP 接收错误:连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

PHPMyAdmin 工作但无法接收“用户''@'localhost' 的访问被拒绝(使用密码:否)”错误

Git推送错误预接收挂钩被拒绝

尝试将现有 git 项目上传到 gitlab 时如何解决“预接收挂钩被拒绝”错误?

连接被拒绝错误的原因是啥?

Android:连接被拒绝错误

我在 http 中遇到错误:socketException:操作系统错误:连接被拒绝