2016-03-28 30 views
-1
dışındaki herhangi bir bağlantı noktasına bağlanmayı reddetti

Bir ana bilgisayara ve bağlantı noktasına bağlanan bir sohbet botunda çalışıyorum. "1234" dışındaki herhangi bir bağlantı noktasına bağlandığımda, bir connect: Connection refused hatası alıyorum. Bu soketten kaynaklanıyor gibi görünüyor, neden sadece tek bağlantı noktasına bağlandığı ile ilgili herhangi bir fikir?Bağlantı, 1234

#include <stdio.h> 
//#include "parse.h" 
#include <netdb.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/un.h> 
#include <stdlib.h> 

int choice(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 
     struct timeval *timeout) { 
    int n = select(nfds, readfds, writefds, exceptfds, timeout); 
    if (n < 0) { 
     perror("select"); 
     exit(1); 
    } 
    return(n); 
} 

int main(int argc, char **argv) { 
    if (argc < 2) { 
     fprintf(stderr, "usage: %s hostname [port number] ...\n", argv[0]); 
     return(1); 
    } 

    int sockfd; 
    char buf[500]; 
    struct hostent *hp; 
    struct sockaddr_in peer; 
    fd_set master; 
    peer.sin_family = AF_INET; 

    if (argc == 2) { 
     peer.sin_port = htons(1234); 
    } else { 
     peer.sin_port = htons(atoi(argv[2])); 
    } 


    //HOST 
    if ((hp = gethostbyname(argv[1])) == NULL) { 
     fprintf(stderr, "%s: no such host\n", argv[1]); 
     return(1); 
    } 

    if (hp->h_addr_list[0] == NULL || hp->h_addrtype != AF_INET) { 
     fprintf(stderr, "%s: not an internet protocol host name\n", argv[1]); 
     return(1); 
    } 

    //SOCKET 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (connect(sockfd, (struct sockaddr *)&peer, sizeof(peer)) == -1) { 
     perror("connect"); 
     close(sockfd); 
     exit(1); 
    } 

    FD_ZERO(&master); 
    FD_SET(STDIN_FILENO, &master); 
    FD_SET(sockfd, &master); 
    fd_set fds = master; 

    //LOOP 
    while(1) { 
     choice(sockfd+1, &fds ,NULL,NULL,NULL); 
     if(FD_ISSET(STDIN_FILENO, &fds)) { 
      fgets(buf, sizeof buf, stdin); 
      if (strlen(buf) > 0) { 
       printf("success"); 
       /* 
       struct expr *e = parse(buf); 
       if (e) { 
        printf("Hey XXX, %d\n", evalexpr(e)); 
        freeexpr(e); 
       } else { 
        printf("Hey XXX, I don't like that.\n[%s]\n", errorstatus); 
       } */ 
      } 
     } 
    } 
} 

Ben minimal ve yinelenen kod tutmak için ekstra kod gerektirir kod bölümünü yorumladı (?). 1235, 20000, 25000, vb. Gibi bağlantı noktalarına bağlanabilmem gerekir.

+2

LISTEN durumunda olan herhangi bir bağlantı noktasına bağlanabilmeniz gerekir. Sadece eski bir liman değil. – EJP

+1

'select()', kendisine iletilen 'fd_set' değişkenlerini değiştirir, böylece her döngü yinelemesinde' fds' değişkenini sıfırlamanız gerekir. Linux'ta, 'select()' de, eğer içeri aktarılırsa 'timeval' değişkenini değiştirir, bu yüzden de (eğer bir tane kullanıyorsanız) bunu da sıfırlamanız gerekir. –

+0

Bu soruyu beğenmedim çünkü her iyi dokümantasyonun açıkça belirttiği bir fonksiyon kullandı **, protokolden bağımsız iletişimi sağlayan bir alternatif lehine ** (modifikasyon olmaksızın IPV4 ve IPV6 üzerinde çalışıyor) Daha da önemlisi, ** temizleyici ve kullanımı daha kolay ** ve muhtemelen sivri bir başparmak gibi hata çubuğunu çıkarmış olur. – Sebivor

cevap

1

Ana bilgisayar adını görüyorsunuz, ancak sonuçta oluşan IP adresini hiçbir zaman peer'a aktarmıyorsunuz, bu nedenle aslında sunucuya bağlanmıyorsunuz . Bunu eklemeniz gerekir:

peer.sin_addr = *((struct in_addr*)(hp->h_addr_list[0])); 
+1

Teknik olarak doğru olsa da, gethostbyname() işlevinin kullanımdan kaldırıldığını unutmayın, bunun yerine getaddrinfo() 'yi kullanmalısınız. 'Connect() 'olarak değiştirilebilen' sockaddr_in' ve/veya 'sockaddr_in6' nesnelerini (ne istediğinize bağlı olarak) bağlantılı bir listesini döndürür. Adreslerden biri başarılı oluncaya veya liste tükenene kadar listede dolaşın. –

+0

@RemyLebeau Düzenleme için teşekkürler. Gethostname() ile ilgili hiçbir şey yazmadım. Muhtemelen yorumunuz OP'ye mi hitap ediyor? – EJP