Connect: Socket operation on non-socket

38,371

I see the problem. It's this line:

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1))

The == operator has precedence over the = operator. Look at the way you have the parentheses structured on that expression a bit more carefully to see what I mean. sockfd is getting initialize to "0" as a result of being assigned a boolean expression (socket(...) == -1).

Change the socket initialization to this:

  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);
    }

Or if you prefer the "assign and compare" on the same line approach, you can probably say this:

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

Notice the subtle difference.

Share:
38,371
Nmzzz
Author by

Nmzzz

Updated on February 06, 2020

Comments

  • Nmzzz
    Nmzzz over 4 years

    I'm new to unix network programming and I have tried to write a program to connect to Google's server. However, I got a error while using the connect() function. (OS: OS X)

    Connect error: Socket operation on non-socket

    I have worked at it for 4 hours but I could not find out the problem. Here is my code:

    #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;
    }