2012-07-15 108 views
1

我正在通過UNIX網絡編程中的示例工作,並且已將「daytimeclientcli.c」改編爲此處特定於linux的代碼(這些示例使用BSD)。我已經在here上對時間服務器運行該程序。無論服務器是否爲connect error: Operation not permitted這是從connect()調用返回的值。我搜查了四周,但我找不到與此相關的任何內容。任何幫助是極大的讚賞。connect()錯誤:操作不允許

#include <stdio.h> 
#include <string.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <errno.h> 

#define BUFFER 80 
int main(int argc, char **argv) { 
    int sockfd; 
    int n; 
    char buf[BUFFER+1]; 
    struct sockaddr_in servaddr; 
    /* need a pointer to socketaddr for call to connect() */ 
    struct sockaddr* ptr; 

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
    fprintf(stderr, "socket error\n"); 
    return 2; 
    } 

    memset(&servaddr, 0, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(13); 

    if (inet_pton(AF_INET, argv[1], &servaddr) <= 0) { 
    fprintf(stderr, "inet_pton error for %s\n", argv[1]); 
    return 3; 
    } 

    ptr = (struct sockaddr*) &servaddr; 
    if (err = connect(sockfd, ptr, sizeof(servaddr)) < 0) { 
    fprintf(stderr, "connect error: %s\n", strerror(err)); 
    return 4; 
    } 

    /* read from socket */ 
    while ((n = read(sockfd, buf, BUFFER)) > 0); 

    if (n < 0) { 
    fprintf(stderr, "read error: %d\n", n); 
    return 5; 
    } else { 
    /* null-terminate the buffer */ 
    buf[n] = 0; 
    printf("%s\n", buf); 
} 

    if (n < 0) { 
    fprintf(stderr, "read error"); 
    return 5; 
    } 

    return 0; 
} 
+0

您可能需要root權限。 – Kludas 2012-07-15 04:13:43

+0

不應該需要root權限,但是你有防火牆規則阻止端口傳出嗎? – 2012-07-15 04:20:12

回答

4

connect()調用失敗,因爲servaddr尚未正確初始化。在調用inet_pton()時,嘗試將「& serv_addr」更改爲「& serv_addr.sin_addr」。

+0

好吧,我不再收到連接()錯誤,但我沒有得到任何時間服務器的迴應,哈哈。不過,我早些時候也有同樣的問題。我認爲他們相當不可靠。 – xst 2012-07-15 05:33:00