UDP接收错误:连接被拒绝。

18

我试图通过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将阻塞直到套接字上有消息可用,您确定服务器正在响应您的消息吗? - jschmier
Server Fault有一篇关于“连接被拒绝”的规范问题(Canonical Question)。点击此处查看。 - Raedwald
2个回答

37

很可能你正在向一个不监听该特定端口的服务器发送数据。

这会导致发送icmp消息,并且在连接套接字时,下一次recvfrom会返回错误信息。

使用tcpdump或wireshark来查看网络上发生了什么。


10
这是正确的答案 - recvfrom 返回的“连接被拒绝”很可能是因为服务器对最初的UDP请求返回了一个ICMP“端口不可达”的响应。 - caf
1
我的Wireshark完全同意 :-) - Sergey
很有可能你正在向一个不监听特定端口或IP地址的服务器发送数据。例如:如果你将UDP服务器绑定到一个特定的IP地址,比如192.168.0.10而不是INADDR_ANY,那么它只会监听该特定IP地址。即使你试图通过发送到localhost127.0.0.1来向同一台计算机上的该服务器发送数据,它也无法连接,因为它只会在IP地址192.168.0.10上监听,而不是在包括任何IP地址(包括localhost(127.0.0.1))的INADDR_ANY上监听。 - Gabriel Staples

-1

我猜测你的IP地址可能有问题,或者端口已经被占用了。UDP是无连接的,所以没有任何“连接”可以失败。


发送的UDP_MSG消息被初始化为常量#define UDP_MSG "HI",可能有什么原因导致它出错吗?它需要正确发送才能从服务器获得任何响应。 - sfactor
嗯...在UDP本身中有一个最小消息大小,但我想套接字层会处理它。 - T.E.D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接