2013-02-06 89 views
2

我是新來的unix網絡編程,我試圖編寫一個程序來連接到Google的服務器。但是,使用connect()函數時出現錯誤。 (OS:OS X)連接:在非套接字上的套接字操作

連接錯誤:套接字操作上非插座

我在這工作了4個小時,但我無法找出問題。這裏是我的代碼:

#define SERVPORT 80 

int main (int argc, char **argv) 
{ 
    int i, sockfd; 
    struct hostent *host; 
    struct sockaddr_in serv_addr; 

    if ((host = gethostbyname(argv[1])) == NULL) { 
    printf("gethostbyname error\n"); 
    exit(1); 
    } 

    for (i = 0; host->h_addr_list[i]; i++) { 
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1)) { 
    printf("socket error\n"); 
    exit(1); 
    } 

    bzero(&serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_port = htons(SERVPORT); 
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr_list[i]); 
    const char *ip = inet_ntoa(serv_addr.sin_addr); 
    printf("connect to %s\n", ip); 

    if (connect(sockfd, (struct sockaddr *) &serv_addr, 
      sizeof(struct sockaddr)) == -1) { 
     printf("connect error:%s\n", strerror(errno)); 
     exit(1); 
    } 

} 
    return 0; 
} 
+0

'connect'的'socklen_t'值應該是'sizeof(struct sockaddr_in)'。 –

+0

你已經打破了賦值 - 如果。調試器會在大約45秒內向您顯示。修正括號,或者更好地將作業移出「if」。 –

回答

17

我看到了問題。它是這一行:

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1)) 

==運算符優先於=運算符。看看你在這個表達式上構造的圓括號更仔細一點,看看我的意思。由於被分配了布爾表達式(socket(...)== -1),sockfd正在初始化爲「0」。

更改端口初始化到這一點:

for (i = 0; host->h_addr_list[i]; i++) 
    { 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd == -1) 
    { 
     printf("socket error\n"); 
     exit(1); 
    } 

或者,如果你喜歡在同一行辦法「分配和比較」,你也許可以這樣說:

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) 

通知微妙區別。

+0

我測試了socked的值,並想知道爲什麼它總是爲零。謝謝 !! – Nmzzz

+1

如果你使用的是gcc,這是另一個*打開'-Wall'的理由,它會給你「警告:建議括號用作真值」 –

+0

@Nmzzz - 這就是我的確切原因不允許將我的團隊中同一個語句中的函數結果與變量賦值進行比較。它的可讀性較差,當我執行代碼評論時,我必須在C precedence表中查找這些內容。 – selbie