segmentation fault in linux (socket programming (TCP) in C) -


i learning socket programming on linux websites , here parts of code on server side using tcp:

#define bufferlength 100 #define servport 3111 int main() {   /* variable , structure definitions. */   int sd, sd2, rc, length = sizeof(int);   int totalcnt = 0, on = 1;   char temp;   char buffer[bufferlength];   struct sockaddr_in serveraddr;   struct sockaddr_in their_addr;   fd_set read_fd;    /* socket descriptor */   if((sd = socket(af_inet, sock_stream, 0)) < 0)   {     perror("server-socket() error");     exit (-1);   }   else     printf("server-socket() ok\n");    /* allow socket descriptor reusable */   if((rc = setsockopt(sd, sol_socket, so_reuseaddr, (char *)&on, sizeof(on))) < 0)   {     perror("server-setsockopt() error");     close(sd);     exit (-1);   }   else     printf("server-setsockopt() ok\n");    /* bind address */   memset(&serveraddr, 0x00, sizeof(struct sockaddr_in));   serveraddr.sin_family = af_inet;   serveraddr.sin_port = htons(servport);   serveraddr.sin_addr.s_addr = htonl(inaddr_any);   printf("using %s, listening @ %d\n", inet_ntoa(serveraddr.sin_addr), servport);    /* continue */ } 

when did last line (printf("using......")), got segmentation fault, why? thanks.

the code shown misses #include headers, stands won't compile due undefined symbols.

it compile if missed prototype library functions referenced code, lead function being assumed return int.

the latter fact might fatal or not.

on 64bit system @ least fatal in case of inet_ntoa() used parameter printf(), on 64bit system expected return 64bit (char-pointer) value (but 32bit int). (assuming prototype misses) when generating code compilers assumes inet_ntoa() return 32bit int lead "chopping-off" significant 32bits of address returned. trying printf() such "crippled" , therefore (most likely) invalid address provokes undefined behaviour , in case leads segmentation violation observed.

to fix this, add relevant prototype (for inet_ntoa()) adding:

#include <arpa/inet.h> 

the compiler should have warned this. enable compiler's warnings gcc use options -wall -wextra -pedantic. take such warnings serious.


Comments

Popular posts from this blog

IF statement in MySQL trigger -

c++ - What does MSC in "// appease MSC" comments mean? -

javascript - Blogger related post gadget image Resize s72-c [ Need Expert Help ] -