2008-02-19, 17:42
#1
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.
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 argc, char *argv[])
{
int sockfd, numbytes;
char bufc[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; // connector's address information
char chatstrang[100];
int chatlen, msgmottaget=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_INET, SOCK_STREAM, 0)) == -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_addr, sizeof 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(sockfd, bufc, MAXDATASIZE-1, 0)) == -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(sockfd, chatstrang, chatlen, 0) == -1)
perror("send");
do
{
// RECV. Ta emot summan.
if ((numbytes=recv(sockfd, bufc, MAXDATASIZE-1, 0)) == -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;
}