【问题标题】:Connect: Socket operation on non-socketConnect:非套接字上的套接字操作
【发布时间】:2013-01-21 04:12:13
【问题描述】:

我是 unix 网络编程的新手,我试图编写一个程序来连接到 Google 的服务器。但是,在使用 connect() 函数时出现错误。 (操作系统: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;
}

【问题讨论】:

  • socklen_tconnect 值应该是 sizeof(struct sockaddr_in)
  • 你已经破坏了 assignment-inside-if。调试器会在大约 45 秒内向您显示。修正括号,或者最好将分配移出if

标签: c sockets unix networking


【解决方案1】:

我看到了问题。就是这一行:

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)

注意细微差别。

【讨论】:

  • 如果您使用 gcc,这也是另一个理由打开-Wall,这将给您“警告:建议在赋值周围使用括号作为真值”
  • 你不认为是时候记住运算符优先级了吗?
  • @EJP - 我在工作时将操作员优先级表的副本保存在 3x5 卡上。在同一张卡的另一面是“ls”的所有命令行参数和“HelloWorld.c”的列表。我总是忘记它是 argc 还是 argv 作为 main 的第一个参数。 :)
  • @JonathonReinhart,感谢您提醒我在 30 年后返回 C 时插入 -Wall。它在我之前发现了更多问题。
  • @selbie 我把我的 K&R(第一版)放在手边。优先级表在第 49 页。:) 全括号是最安全的,并且使 vi "%" 工作得很好,尤其是 d% 可以杀死表达式的一个术语。
猜你喜欢
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多