【问题标题】:connect() error: operation not permitted连接()错误:不允许操作
【发布时间】:2012-07-15 04:01:26
【问题描述】:

我正在研究 UNIX 网络编程中的示例,并且我已将“daytimeclientcli.c”改编成这里的代码,这是特定于 linux 的(这些示例使用 BSD)。我已经在here 上针对时间服务器运行了该程序。无论服务器如何,我都会得到connect error: Operation not permitted,这是调用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;
}

【问题讨论】:

  • 你可能需要root权限。
  • 不应该需要root权限,但你有阻止端口传出的防火墙规则吗?

标签: c linux sockets network-programming


【解决方案1】:

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

【讨论】:

  • 好吧,我不再收到 connect() 错误,但我没有收到来自时间服务器的任何响应,哈哈。不过,我之前也遇到过同样的问题。我认为它们相当不可靠。
猜你喜欢
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2021-01-14
相关资源
最近更新 更多