2015-06-27 92 views
1

編輯我是一個白癡,問題是一個錯位的括號感謝幫助球員。從綁定()收到C++ errno 22

我想獲得一個套接字來初始化,但當我嘗試綁定套接字時,我一直在獲取errno 22。我已經閱讀了無數的教程,並在套接字上搜索了數據庫,但是我不能爲我的生活弄清楚這一點。你們有沒有專業人士幫助新手?

我的問題似乎是在這個代碼塊:

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0)) 
     { 
      printf("Error binding socket: %d\n", errno); 
      return 1; 
     } 

沒有實際的程序錯誤,但該程序打印從錯誤號設置爲22,並返回1.

這裏我的代碼:

#include "Server.h" 
#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <errno.h> 

int serverSock, newSockFd, port; 
unsigned int clientAddrLen; 

struct sockaddr_in serverAddr, clientAddr; 

int Server::ServerStart(short int portno) 
{ 
    port = portno; 
    if(port < 10) 
    { 
     printf("Invalid port number\n"); 
     return 1; 
    } 
    printf("Port valid, creating new socket\n"); 

    serverSock = socket(AF_INET, SOCK_STREAM, 0); 

    if(serverSock < 0) 
    { 
     printf("Error opening socket: %d\n", errno); 
     return 1; 
    } 
    else 
    { 
     printf("Socket open\n"); 

     bzero((char *)(&serverAddr), sizeof(serverAddr)); 

     serverAddr.sin_port = htons(port); 
     serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
     serverAddr.sin_family = AF_INET; 

     printf("Binding socket\n"); 

     if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0)) 
     { 
      printf("Error binding socket: %d\n", errno); 
      return 1; 
     } 
     else 
     { 
      printf("Socket bound, listening for new connection\n"); 

      listen(serverSock, 5); 

      printf("New connection found\n"); 

      clientAddrLen = sizeof(clientAddr); 
      newSockFd = accept(serverSock, (struct sockaddr*) &clientAddr, &clientAddrLen); 
      if(newSockFd < 0) 
      { 
       printf("Error accepting connection: %d\n", errno); 
       return 1; 
      } 
      else 
      { 
       printf("New Socket is: %d\n", newSockFd); 
       return newSockFd; 
      } 
     } 
    } 
} 

這是我的第一篇文章,所以我希望我沒有它正確,請隨時點的任何事情我做錯了還是可以做的更好(即使它不屬於交流這個問題,我總是樂於學習)。

+0

如果使用['perror'(http://pubs.opengroup.org/onlinepubs/009695399/functions/perror.html)它會給你一個很好的說明「errno」的含義。我猜22意味着['EINVAL'](http://www.virtsync.com/c-error-codes-include-errno),這意味着你的論點是無效的。對於最後一個參數,您可能會傳遞'sizeof(serverAddr)<0'(計算結果爲0)而不是'sizeof(serverAddr)'。 – Cornstalks

回答

1

我相信你放錯了右括號。

這裏

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0)) 

傳遞sizeof(serverAddr) < 0(這是false所以它轉換爲0)作爲最後一個參數bind因此很明顯失敗。

應該

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr)) < 0)