2016-04-11 21 views
-5

İki farklı kod dosyanız var: biri istemciye, diğeri ise sunucu içindir.Linux'ta Bölümlendirme Hatası C

İstemci kodumda bir segmentasyon hatası var ve bu nedenle, asla sunucuma bağlanmama izin vermiyor. Müşteri kodunu ekledim. Sunucuya ihtiyacınız varsa, ben de ekleyeceğim. Sadece hayatım boyunca çalışmak için bunu alamıyorum. Teşekkürler!

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> // for struct sockaddr_in 
#include <unistd.h> 
#include <stdio.h> 
#include <netdb.h> // for gethostbyname 
#include <string.h> // for memcpy 
#include <endian.h> 

int 
main(int argc, char **argv) 
{ 
       //  IPv4  TCP 
    int sock = socket(PF_INET, SOCK_STREAM, 0); 
    struct sockaddr_in connecting_address = { 
     .sin_family = AF_INET, 
     .sin_port = htons(3000)  // connect on port 3000 
    }; 
    struct hostent *host = gethostbyname(argv[1]); 
    memcpy(&connecting_address.sin_addr.s_addr, 
     host->h_addr, host->h_length); 
    printf("Connecting to %s...\n", argv[1]); 
    connect(sock, (struct sockaddr *)&connecting_address, 
     sizeof connecting_address); 
    printf("Successfully connected\n"); 

    // send an integer across the network 
    printf("Enter a number you would like squared\n"); 
    int n; 
    scanf("%d", &n); 
    uint64_t n_be = htobe64(n); 
    write(sock, &n_be, sizeof n_be); // send to server 

    // wait for a response from the server 
    uint64_t answer_be; 
    read(sock, &answer_be, sizeof answer_be); 
    int answer = be64toh(answer_be); 
    printf("The result is %d\n", answer); 

    close(sock); 
    return 0; 
} 
+3

Neden sorunun nerede olduğunu görmek için ayıklayıcısında kod adım değil connecting_address.sin_addr.s_addr içine sunucu tarafında IP adresidir görüyor musunuz? –

+1

Bildiğimiz her şey için, gerekli ancak kontrol edilmeyen komut satırı argümanını vermediniz. –

+1

Ya da bir argüman beslediniz, ama argüman bir ana bilgisayar adı olarak çözülmediğini ve eşit olarak denetlenmeyen 'ana bilgisayar' NULL öğesinin kaldırıldığını söyledi. – WhozCraig

cevap

1

Çıktılarınızdan herhangi birini belirtmediğinizden, gethostbyname muhtemelen NULL döndürüyordur. Diğerleri belirtildiği gibi ana bilgisayar NULL olmak için kontrol etmelisiniz. Ana bilgisayar NULL ise h_errno'ya da bakmalısınız. http://linux.die.net/man/3/gethostbyname

test etmek yapabileceği başka bir şey sadece sert kod