2016-11-25 8 views
0

Я пытаюсь изучить программирование сокета c/C++, но функция привязки работает нормально или не возвращает то, что она должна вернуть, вместо «int», возвращающего «__bind», я не знаю, что случилось, и я искал, что чтобы сделать и не из не приходятВозвращаемое значение для bind не является int?

пожалуйста, помогите

Server::Server() 
: sock_fd(0) 
{ 
    // number used as index in to the vector of client fd 
    num = 0; 
    clino.reserve(10); 
    clientfd.reserve(10); 
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0) 
    { 
     perror("Server constructor : cannot open socekt"); 
    } 
    bzero(&servaddr, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(TCP_PORT); 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    //error returning __bind<int&, sockaddr*, unsigned long> 
    int b = bind(sock_fd,(sockaddr *)&servaddr, sizeof(servaddr)); 



    //this bind function is acting up, dosent want to let me check for errors lol 



    printf("printing..\n"); 
} 




int Server::waitforconnections() 
{ 

    printf("listening....\n"); 

    if(listen(sock_fd, 5) < 0) 
    { 
     perror("Server constructor : listen error"); 
    } 

    for(;;) 
    { 
     clino[num] = num + 1; 
     printf("accepting.. \n"); 
     clientfd[clino[num]] = accept(sock_fd, (sockaddr *)&cliaddr, clilen); 
     clisocktoaddr[clientfd[num]] = cliaddr; 
     if(clientfd[num] < 0) 
     { 
      perror("waitforconnections: accept error"); 
     } 
     //no client number 0 
      if(do_service() < 0) 
      { 
       perror("waitforconnections: cannot do service, !!FATAL ERROR!!"); 
       _exit(-1); 
      } 
     //if i am going to use kids then they must be some inter processing communication don't forget !! 


     num++; 
    } 




    return (0); 
} 
+1

'std :: bind' возвращает объект функции, а не значение. Пожалуйста, прочитайте [docs] (http://en.cppreference.com/w/cpp/utility/functional/bind). – Rakete1111

+0

В общем, вы, кажется, немного не знакомы с C++. Например, 'bzero' не было бы необходимо, если бы вы определили его как' sockaddr_in servaddr = {AF_INET, htons (TCP_PORT), {htonl (INADDR_ANY)}} – MSalters

+0

о, действительно, я этого не сделал, спасибо вы так много –

ответ

5

вы не вызывая функцию вы думаете, что вы звоните.

Вместо того, чтобы звонить bind, вы звоните std::bind. Это одна из подводных камней, которая может произойти, если в вашем коде есть using namespace std;.

У вас есть два варианта. Вы можете вызвать функцию сокета bind, используя ::bind в качестве имени функции. В качестве альтернативы вы можете удалить using namespace std; и префикс любого объекта из этого пространства имен std::. Последнее может означать больше изменений в вашем коде, но это повысит читаемость, если будет более ясно, что используется.

+0

Или еще лучше, удалите 'using namespace std;'. –

+0

Большое вам спасибо, вот и все! –

+0

@ p.ferife Рад, что я мог бы помочь. Не стесняйтесь [принять этот ответ] (http://stackoverflow.com/help/accepted-answer), если вы сочтете это полезным. – dbush