Verbinden: Socket-werking op niet-socket

Ik ben nieuw in het programmeren van unix-netwerken en ik heb geprobeerd een programma te schrijven om verbinding te maken met de server van Google. Ik kreeg echter een fout tijdens het gebruik van de functie connect(). (OS: OS X)

Verbindingsfout: socketwerking op niet-socket

Ik heb er 4 uur aan gewerkt, maar ik kon het probleem niet vinden. Hier is mijn 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;
}

Antwoord 1, autoriteit 100%

Ik zie het probleem. Het is deze regel:

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

De == operator heeft voorrang op de = operator. Kijk wat nauwkeuriger naar de manier waarop je de haakjes op die uitdrukking hebt gestructureerd om te zien wat ik bedoel. sockfd wordt geïnitialiseerd naar “0” als gevolg van een booleaanse uitdrukking (socket(…) == -1).

Verander de initialisatie van de socket in dit:

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

Of als u de voorkeur geeft aan “toewijzen en vergelijken” op dezelfde lijnbenadering, kunt u waarschijnlijk dit zeggen:

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

Let op het subtiele verschil.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

three × three =

Other episodes