2016-11-25 16 views
0

私はc/C++ソケットプログラミングを学習しようとしていますが、バインド関数が正常に動作しているか、返されるべきものが返されていません。 "int"の返り値 "__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++にはあまり馴染みがないようです。たとえば、メンバーを 'sockaddr_in servaddr = {AF_INET、htons(TCP_PORT)、{htonl(INADDR_ANY)}}'のように定義した場合、 'bzero'は必要ありません。 – MSalters

+0

本当に、あなたはそんなに –

答えて

5

を助けてくださいあなたは、あなたが呼んでいると思う関数を呼び出していません。

bindを呼び出す代わりに、std::bindを呼び出しています。これは、あなたのコードにusing namespace std;があるときに起こり得る落とし穴の1つです。

ここには2つのオプションがあります。関数名として::bindを使用して、ソケットbind関数を呼び出すことができます。あるいは、using namespace std;を削除し、この名前空間のオブジェクトの先頭にstd::という接頭辞を付けることができます。後者はコードの変更が増えることを意味しますが、使用されているものがより明確になることで可読性が向上します。

+0

またはそれより良いことに、 'using namespace std;'を削除してください。 –

+0

ありがとうございました! –

+0

@ p.ferifeうれしいです。あなたが役に立つと思ったら、[この回答を受け入れる](http://stackoverflow.com/help/accepted-answer)を自由に感じてください。 – dbush

関連する問題