connect()错误:操作不允许

问题描述:

我正在通过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

connect()调用失败,因为servaddr尚未正确初始化。在调用inet_pton()时,尝试将“& serv_addr”更改为“& serv_addr.sin_addr”。

+0

好吧,我不再收到连接()错误,但我没有得到任何时间服务器的回应,哈哈。不过,我早些时候也有同样的问题。我认为他们相当不可靠。 – xst 2012-07-15 05:33:00