连接:非套接字上的套接字操作

时间:2013-02-06 03:31:54

标签: c sockets unix networking

我是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;
}

1 个答案:

答案 0 :(得分:20)

我看到了问题。这就是这条线:

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)

注意细微差别。

相关问题