Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

3 way UDP chat program segmentation fault

$
0
0
I am having some difficulty with this program. Right now I am running into a segmentation fault whenever anything is sent to the server. I also need to create a database to store those that enter the chat so that private messages can be sent to them but I have no idea how I should go about doing that. I believe the client is 99% of the way done, I just need to uncomment the one line (sending username to server for database). The server is where I am having difficulty I believe. I will provide the code.

Client

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>

extern int errno;

int main (int argc, char *argv[]){
	char hname[255];
	struct sockaddr_in sin;
	struct sockaddr_in lin;
	socklen_t sinlength;
	socklen_t linlength;
	struct hostent *ph;
	int thesock;
	int len;
	long address;
	char host[40];
	char strinput[4096];
	char strinput2[4096];
	char buf[4096];
	char x;
	struct sockaddr_in to_addr;
	struct sockaddr_in from;
	socklen_t fromlen;
	int i;
	char username[20];
	int pid;
	char message;
	int s;

	
	if (argc != 3){
		printf("Usage:   ./a.out 172.21.24.1 port\n");
		exit(1);
	}
	else{
		strcpy(host, argv[1]);
	}
	
	if ((ph = gethostbyname (host)) == NULL){
		switch (h_errno){
			case HOST_NOT_FOUND:
				fprintf(stderr, "%s: no such host %s\n", argv[0], host);
				exit(1);
			case TRY_AGAIN:
				fprintf(stderr, "%s: host %s, try again later\n", argv[0], host);
				exit(1);
			case NO_RECOVERY:
				fprintf(stderr, "%s: host %s   DNS ERROR\n", argv[0], host);
				exit(1);
			case NO_ADDRESS:
				fprintf(stderr, "%s: No IP address for %s\n", argv[0], host);
				exit(1);
			default:
				fprintf(stderr, "Unknown error: %d\n", h_errno);
				exit(1);
			}
		}
	else {
		memcpy ((char *) &sin.sin_addr, (char *) ph ->h_addr, ph -> h_length);
		sin.sin_family = PF_INET;
	}
	
	i = gethostname(host, len);

	sin.sin_port = atoi(argv[2]);
	
	if ((s = socket (PF_INET, SOCK_DGRAM, 0)) < 0) {
		perror ("socket");
		exit(1);
	}
	
	lin.sin_family = PF_INET;
	lin.sin_addr.s_addr = INADDR_ANY;
	lin.sin_port = 0;

	linlength = sizeof(lin);
	
	if (bind(s, (struct sockaddr *) &lin, linlength) < 0){
		perror ("bind");
		exit(1);
	}
	
	if (getsockname(s, (struct sockaddr *) &lin, (socklen_t *) &linlength) < 0){
		perror ("getsockname");
		exit(1);
	}
	
	printf("What is your username?\n");
	fgets(username, 20, stdin);
	
	len = sizeof(hname);
	sinlength = sizeof(struct sockaddr_in);
//	sendto(s, username, strlen(username), 0, (struct sockaddr *) &sin, sizeof (struct sockaddr));
	
	printf("\n");
	printf("You can send any text that you want. There are 2 special commands.\n");
	printf(".send <username> = send a private message to the username specified.\n");
	printf("(DO NOT INCLUDE <> IN THE COMMAND\n");
	printf(".quit = quit the program.\n");
	printf("\n");

	while(1){
		pid = fork();
		if (pid==0){
			recvfrom(s, buf, 4095, 0, (struct sockaddr *) &from, &fromlen);
			buf[message] = '\0';
			printf("\n(%s, %d) said : ", inet_ntoa(from.sin_addr), ntohs(from.sin_port));
			printf("%s", buf);
			printf("\n");
			printf("\n");
		}
		else {
			char * strinput2;
			fgets(strinput, 4095, stdin);
			if (strinput2 = strstr (strinput, ".quit")){
				sendto(s, strinput2, strlen(strinput2), 0, (struct sockaddr *) &sin, sizeof (struct sockaddr));
				recvfrom(s, buf, 4095, 0, (struct sockaddr *) &from, &fromlen);
				printf("The Client is now closing.\n");
				close(s);
				while ('\n' != getchar()){
					getchar();
					exit(1);
				}
			}
			else{
				sendto(s, strinput, strlen(strinput), 0, (struct sockaddr *) &sin, sizeof (struct sockaddr));
			}
		}
	}
}


Server

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

extern int errno;

int main(int argc, char *argv[]){
	const char * message;
	int i;
	int s;
	int fd;
	int len;
	struct sockaddr_in sin;
	int sinlength;
	char buf[BUFSIZ];
	int buflen;
	char x;
	char strinput[50];
	struct sockaddr_in from;
	socklen_t fromlen;

	int action;

	if ((s = socket(PF_INET, SOCK_DGRAM,0)) < 0){
		perror("Socket");
		exit(1);
	}
	sin.sin_family = PF_INET;
	sin.sin_addr.s_addr = INADDR_ANY;
	sin.sin_port = 0;
	sinlength = sizeof(sin);

	if (bind(s, (struct sockaddr *) &sin, sinlength) < 0){
		perror("bind");
		exit(1);
	}
	
	if (getsockname(s, (struct sockaddr *) &sin, (socklen_t *) &sinlength) < 0){
		perror("getsockname");
		exit(1);
	}

	printf ("Socket is using port %d\n", sin.sin_port);
	printf ("The Server is now running.\n");

	while(1){
		recvfrom(s, buf, buflen, 0, (struct sockaddr *) &from, &fromlen);
//		buf[message] = '\0';
		message==buf;
		if (message = strstr(message, ".quit")){
			char *reply;
			reply = "Acknowledged Quit command";
			printf ("(%s , %d) has left the forum");
			sendto(s, reply, strlen(reply), 0, (struct sockaddr *) &from, fromlen);
			close(s);
			while ('\n' != getchar()){
				getchar();
				exit(1);
			}
		}
		if (message = strstr(message, ".send")){
			//parse .send
				//parse username
					sendto(s, message, strlen(message), 0, (struct sockaddr *) &from, fromlen);
		}
		else {
			printf("(%s , %d) said : ", inet_ntoa(from.sin_addr), ntohs(from.sin_port));
			sendto(s, message, strlen(message), 0, (struct sockaddr *) &from, fromlen);
		}
	}
}



Any help will be greatly appreciated. I have been working on this program for 3 weeks now and it is driving me crazy. I have never used C before only C++ and I have never done any socket programming. I also am not good with linux so if there are any commands you suggest me to use please explain them fully.

Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>