2015-10-25 2 views
0

Я пишу клиентскую программу сервера, используя программирование сокетов C++ в Ubuntu.getaddrinfo всегда подключается. даже если в этом порту нет пассивно-открытого соединения.

Это код для подключения клиента к серверу.

void setParent(string name,int parentPort){ 
    struct addrinfo hints, *serverInfo , *rp; 
    int errcode; 
    char addrstr[100]; 
    void *ptr; 
    int sfd; 
    std::string parentPortStr = std::to_string(parentPort); 
    memset (&hints, 0, sizeof (hints)); 
    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = 0; 
    hints.ai_flags = AI_PASSIVE; 
    cerr << name << " " << parentPortStr << endl; 
    errcode = getaddrinfo (name.c_str() , parentPortStr.c_str(), &hints, &serverInfo); 
    if (errcode != 0) 
    { 
     cerr << "getaddrinfo has error" << endl; 
     return; 
    } 

    for (rp = serverInfo; rp != NULL; rp = rp->ai_next) { 
     cerr << "Trying next api " << rp->ai_family << " " << rp->ai_socktype << " " << rp ->ai_protocol << endl; 
     sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); 
     if (sfd == -1) 
      continue; 
     if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1){ 
      int enabled = 1; 
      setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &enabled, sizeof(int)); 
      break; 
     } 
     close(sfd); 
    } 
    freeaddrinfo(serverInfo); 
    if(sfd == -1){ 
     cerr << "cannot connect to father" << endl; 
     return; 
    } 
    cerr << "connected to father successfuly. socket: " << sfd << endl; 
    fatherSocket = sfd; 
    return; 
} 

, когда я называю этот код следующим образом: setParent ("localhost", "300"); Он всегда будет принимать соединение. Это не имеет значения, если какая-либо программа прослушивает порт 7300 или нет.

здесь Debug выход:

setparent localhost 300 
localhost 7300 
Trying next api 2 1 6 
connected to father successfully. socket: 5 

и это не имеет значения, если я меняю порт. Он всегда пытается api с ai_family: 2, ai_socktype: 1, ai_protocol: 6 и будет успешно подключаться к нему.

здесь «Суда NetStat -tulpn» результат:

tcp  0  0 127.0.1.1:53   0.0.0.0:*    LISTEN  1163/dnsmasq  
tcp  0  0 127.0.0.1:631   0.0.0.0:*    LISTEN  4814/cupsd  
tcp6  0  0 ::1:631     :::*     LISTEN   4814/cupsd  
udp  0  0 0.0.0.0:45464   0.0.0.0:*       601/avahi-daemon: r 
udp  0  0 0.0.0.0:631    0.0.0.0:*       989/cups-browsed 
udp  0  0 0.0.0.0:5353   0.0.0.0:*       601/avahi-daemon: r 
udp  0  0 0.0.0.0:26517   0.0.0.0:*       5053/dhclient 
udp  0  0 127.0.1.1:53   0.0.0.0:*       1163/dnsmasq  
udp  0  0 0.0.0.0:68    0.0.0.0:*       5053/dhclient 
udp6  0  0 :::50297    :::*        601/avahi-daemon: r 
udp6  0  0 :::5353     :::*        601/avahi-daemon: r 
udp6  0  0 :::46583    :::*        5053/dhclient 

Как вы видите, никто не прослушивает порт 7300.

Я не могу получить то, что там происходит.

ответ

2

Как вы видите на своем собственном дисплее netstat, к 7300 никто не подключен.

Вы испытываете неправильную вещь. Вы должны проверить, стал ли enabled 1. connect() не будет (не может) волшебным образом установить sfd на -1, если он терпит неудачу.

+0

жаль, что я не могу понять, что я должен делать. что включено ?. вы можете показать мне пример? –

+0

'enabled' - это переменная, которую вы устанавливаете в своем собственном коде, когда вы успешно подключаетесь, и поэтому вы должны ее протестировать. Если вы не можете понять, что вы вне всякой помощи, я могу вам дать, – EJP

+0

lol. Я понял. виноват :). благодаря –