Hello.
I am getting a segmentation fault on my socket program. First I coded this program without sockets using printf statements and the program worked exactly as intended. Now when I "combined" the two, I get a segmentation fault at a certain point in the program I get it only in "case 3" of my code. I am hoping someone can spot what I might be missing. I am posting what I believe to be relevant code as it is a pretty long program.
classes.h:
Main portion of the sockets. (client side)Code:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BINFILE "classes.db" #define MAX_RECORD 10 #define BUF 2048 static int sockfd; struct sockaddr_in self, client_addr; typedef enum {MW, TR} days; typedef struct { int hour, min; } Time; typedef struct { char Dept[5]; int course, sect; days meet_days; Time start, end; char instr[20]; } sched_record; int sortFunction(const void *p, const void *q);
Menu for case 3Code:int switchInput; int i = 0; int connected; int sock; int bytes_received; int sin_size; int true = 1; int tempCourse = 0; char send_data[BUF]; char recv_data[BUF]; char tempDept[5]; char tempDay[2]; char tempTime[2]; FILE *filePointer; sched_record data[MAX_RECORD]; filePointer = fopen (BINFILE, "rb"); if ((sock = socket (AF_INET, SOCK_STREAM, 0)) == -1) { perror ("Socket"); exit(1); } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(int)) == -1) { perror ("Setsocketopt"); exit(1); } self.sin_family = AF_INET; self.sin_port = htons(nunya); bzero(&(self.sin_zero), 8); self.sin_addr.s_addr = inet_addr ("127.0.0.0"); if (bind (sock, (struct sockaddr *)(&self), sizeof (self)) < 0) { perror ("Unable to bind"); exit(1); } if (listen(sock, 5) == -1) { perror("Listen"); exit(1); } if (filePointer == NULL) { perror("**Can't open file**"); exit(1); } printf("\nTCPServer waiting for client on port 13018"); fflush(stdout); while(1) { sin_size = sizeof(struct sockaddr_in); connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size); printf("\n I got a connection from (%s, %d)", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); printf("\n"); char send_data[] = "Server is Ready"; send(connected, send_data, strlen(send_data), 0); while(1) { bytes_received = recv(connected, recv_data, BUF, 0); recv_data[bytes_received] = '\0'; switchInput = atoi (recv_data); switch(switchInput) {
And the tested problem area:Code:case 3: fread(data, sizeof(sched_record), MAX_RECORD, filePointer); fclose(filePointer); char send_data_3[] = "Enter Department Name or A for all: "; send(connected, send_data_3, strlen(send_data_3), 0); bytes_received = recv(connected, recv_data, BUF, 0); recv_data[bytes_received] = '\0'; strcpy(tempDept, recv_data); char send_data_4[] = "Enter Course Number of 0 for any course in department: "; send(connected, send_data_4, strlen(send_data_4), 0); bytes_received = recv(connected, recv_data, BUF, 0); recv_data[bytes_received] = '\0'; tempCourse = atoi (recv_data); char send_data_5[] = "Enter Days of Class, M for MW, T for TTH or D for any: "; send(connected, send_data_5, strlen(send_data_5), 0); bytes_received = recv(connected, recv_data, BUF, 0); recv_data[bytes_received] = '\0'; strcpy(tempDay, recv_data); char send_data_6[] = "Enter A for mornings, P for afternoons of D for any: "; send(connected, send_data_6, strlen(send_data_6), 0); bytes_received = recv(connected, recv_data, BUF, 0); recv_data[bytes_received] = '\0'; strcpy(tempTime, recv_data);
Thank you for looking this over. I really appreciate it!Code:else if ((strcmp(tempDept, data[i].Dept)==0) && tempCourse == 0 && (strcmp(tempDay, "D")==0) && (strcmp(tempTime, "D")==0)) { sprintf("%s %d %d %2s %02d%02d %02d%02d %s\n", data[i].Dept, data[i].course, data[i].sect, data[i].meet_days == MW ? "MW" : "TR", data[i].start.hour, data[i].start.min, data[i].end.hour, data[i].end.min, data[i].instr); send(connected, send_data, strlen(send_data), 0); }



LinkBack URL
About LinkBacks



