2010-03-03 66 views
12

Tôi đang cố gắng gửi một chuỗi HI đến một máy chủ qua UDP trong một cổng cụ thể và sau đó nhận phản hồi. Tuy nhiên, sau khi tôi cố gắng để có được phản ứng bằng cách sử dụng recvfrom() tôi đã bị mắc kẹt trong trạng thái chặn. Tôi đã cố gắng sử dụng UDP kết nối nhưng tôi nhận:Lỗi khi nhận trong UDP: Kết nối bị từ chối

Lỗi nhận trong UDP: Kết nối từ chối

gì có thể là lý do cho việc này? Máy chủ không nằm trong tầm kiểm soát của tôi, nhưng tôi biết nó hoạt động tốt.

Tôi đã thêm mã

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; 
+0

Vì 'recvfrom' sẽ chặn cho đến khi thư có sẵn tại ổ cắm, bạn có chắc máy chủ đang trả lời thư của bạn không? – jschmier

+0

Lỗi máy chủ có câu hỏi chuẩn về [Kết nối bị từ chối] (http://serverfault.com/questions/725262/what-causes-the-connection-refused-message). – Raedwald

Trả lời

-1

Tôi đoán sẽ là địa chỉ IP của bạn là xấu bằng cách nào đó, hoặc các cổng đã được sử dụng bằng cách nào đó. UDP là không kết nối, do đó, thực sự không có bất kỳ "kết nối" nào bị lỗi.

+0

có thể có bất kỳ lý do nào cho UDP_MSG mà tôi gửi, được khởi tạo là hằng số #define UDP_MSG "HI" có sai không? nó cần phải được gửi chính xác để lấy lại bất kỳ phản hồi nào từ máy chủ. – sfactor

+0

Vâng ... có một kích thước tin nhắn * tối thiểu * trong UDP, nhưng tôi sẽ tưởng tượng lớp Sockets sẽ quan tâm đến điều đó. –

23

Rất có thể bạn đang gửi thứ gì đó đến máy chủ không nghe trên cổng cụ thể đó. Điều đó sẽ khiến tin nhắn icmp được gửi lại và lần truy cập tiếp theo của bạn sẽ trả lại lỗi trong trường hợp bạn kết nối ổ cắm.

Kiểm tra với tcpdump hoặc wireshark những gì đang xảy ra trên dây.

+7

Đây là câu trả lời đúng - "Kết nối bị từ chối" từ 'recvfrom' khá có thể là do máy chủ trả về phản hồi ICMP" Port Unreachable "với yêu cầu UDP ban đầu. – caf

Các vấn đề liên quan