2008-02-19, 17:42
  #1
Medlem
Jag fr "Segmentation fault" nr jag kr detta. Jag har lst lite om seg fault men vet inte riktigt hur jag ska felska det.
Den miljn jag krt kompilering och test p (och vilket jag endast har tillgng hemma) s fungerar mitt socketprogram utan problem. Medan nr jag skulle redovisa s fick jag seg fault. Olika knsliga fel fr minnsefel antar jag.

Denna kod r bara en liten modifiering av Beejs socketexempel.

Kod:
/*
** client.c -- a stream socket client demo
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define MAXDATASIZE 100 // max number of bytes we can get at once

int main(int argcchar *argv[])
{
    
int sockfdnumbytes;
    
char bufc[MAXDATASIZE];
    
struct hostent *he;
    
struct sockaddr_in their_addr// connector's address information
    
char chatstrang[100];
    
int chatlenmsgmottaget=0;


    
/* Kolla om rtt antal argument matats in.
    argv[1] = filnamn, 2 = frsta kommando, 3 = andra kommando
    Allts 3 argument totalt.
    */
    
if (argc != 3)
    {
        
fprintf(stderr,"usage: client <hostname> <port>\n");
        exit(
1);
    }


    
// Omvandla det inmatade domnnamnet till dess IP-adress.
    
if ((he=gethostbyname(argv[1])) == NULL)     
    {
        
perror("gethostbyname");   // Hmm? With gethostbyname(), you can't use perror() to print error message (since errno is
                                   // not used). Instead, call herror().
        
exit(1);
    }


    
// SOCKET. ppna en socketdeskriptor.
    
if ((sockfd socket(AF_INETSOCK_STREAM0)) == -1)      
    {
        
perror("socket");
        exit(
1);
    }

    
// Tilldela structen their.addr protokoll, portnr, och IP-adress.
    
their_addr.sin_family AF_INET;                // host byte order
    
their_addr.sin_port htons(atoi(argv[2]));     // short, network byte order      // Hr tas portnr emot som matats in i kommandoraden.
    
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    
memset(their_addr.sin_zero'\0'sizeof their_addr.sin_zero);


    
// CONNECT. Anslut till servern mha socketdeskriptorn.
    
if (connect(sockfd, (struct sockaddr *)&their_addrsizeof their_addr) == -1)  
    {
        
perror("connect");
        exit(
1);
    }

    
// Skriv ut IP-adress fr den servern klienten ansluter till.
    
printf("\nclient: connected to server %s\n",inet_ntoa(their_addr.sin_addr));

    
// RECV. Ta emot vlkomstmeddelandet.
    
if ((numbytes=recv(sockfdbufcMAXDATASIZE-10)) == -1)     
    {
        
perror("recv");
        exit(
1);
    }

    
// Skriver ut vlkomstmeddelandet.
    
else
    {
        
bufc[numbytes] = '\0';
        
printf("%s",bufc);
    }


    do
    {
        
// Ls in talet.

        
fgets(chatstrang,99,stdin);
        
chatlen strlen(chatstrang);

        
// SEND. Skicka talet.
        
if (send(sockfdchatstrangchatlen0) == -1)
           
perror("send");

        do
        {

            
// RECV. Ta emot summan.
            
if ((numbytes=recv(sockfdbufcMAXDATASIZE-10)) == -1)
            {
                
perror("recv");
                exit(
1);
            }

            
// Skriv ut summan.
            
else
            {
                
bufc[numbytes] = '\0';
                
printf("%s",bufc);
                
msgmottaget 1;
            }
        }while(
msgmottaget != 1);

        
msgmottaget 0;    // nollstll msg-kollaren

    
}while(strcmp(chatstrang,"0\n") != 0);

    
close(sockfd);

    return 
0;

Citera
2008-02-19, 17:57
  #2
Medlem
t.c: In function `main':
t.c:69: warning: implicit declaration of function `inet_ntoa'
t.c:69: warning: format argument is not a pointer (arg 2)
Citera
2008-02-19, 18:16
  #3
Medlem
Hmm, fick inte det felet nr jag kompilerade med gcc. Fick inget fel alls, utan endast vid krning.
Jag tror ocks att jag avkommenterade den raden en gng men det hjlpte inte.
Tyvrr sger mig inte varningarna mycket. Jag har kollat Beejs Guide och det verkar vara korrket stt att skriva.

Citat:
What if you have a struct in_addr and you want to print it in
numbers-and-dots notation? In this case, you'll want to use the function inet_ntoa()
(ntoameans network to ascii) like this:

printf("%s", inet_ntoa(ina.sin_addr));

That will print the IP address.
__________________
Senast redigerad av Lanix 2008-02-19 kl. 18:20.
Citera
2008-02-19, 18:25
  #4
Medlem
Tooners avatar
Segmentation fault r vl helt enkelt nr programmet kraschar. Typ division med 0, anvnda null-vrden dr man inte fr och s vidare.

Det syns ju oftast inte vid kompileringen.
Citera
2008-02-19, 18:27
  #5
Medlem
Citat:
Ursprungligen postat av Lanix
Tyvrr sger mig inte varningarna mycket. Jag har kollat Beejs Guide och det verkar vara korrket stt att skriva.
Funktionen har ingen prototyp eftersom du inte har inkluderat arpa/inet.h, och kompilatorn antar drfr att funktionen returnerar en int.

int p en 64-bit-arkitektur r vanligtvis 32-bit, medans pekare r 64-bit. Pekaren blir allts trunkerad, och programmet krashar.

Fr att se varningen mste du kompilera med -Wimplicit-function-declaration, eller nnu bttre: -Wall.
Citera
2008-02-19, 18:54
  #6
Medlem
Ah, du har rtt. Jag lste guiden igen och jag lyckades missa att arpa/inet.h krvdes. Tack.
Citera
2008-02-19, 19:03
  #7
Medlem
Megaforces avatar
Citat:
Ursprungligen postat av Tooner
Segmentation fault r vl helt enkelt nr programmet kraschar. Typ division med 0, anvnda null-vrden dr man inte fr och s vidare.

Det syns ju oftast inte vid kompileringen.

Nja, segmentation fault betyder allts att en pekare till minnesadress pekar utanfr det minnesomrde som man allokerat, dvs fr jobba mot. Men t.ex. division med 0 kan ge fel i register och adresser s att man fr just segmentation fault.

ven minnesfel (trasigt internminne) eller felaktigt konfigurerad deviceenhet kan ge just segmentation fault.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in