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);
}