I am trying to create a client to connect to a mysql database using sockets. I have the following code but of course, its not working to my advantage. Right now, this code connects to a server file located on a linux machine...i havent coded it yet to connect to a database. What is the best approach when trying to connect to a database so I have the option to add/delete/view information on my database. I been reading up on the MYSQL API but I want to see if its possible through sockets and if so how? Here is the code i have thus far:

#include <iostream>
#include <string>
#include <fstream>


//this is taken straight from the it420 joke code to make sure all
//headers are referenced.  Code surrounded by these slashes
//are used to show what code was taken from the it420 client file
//////////////////////////////////////////////////////////////////
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <arpa/inet.h>

#define SERVER_PORT htons(63513)
//////////////////////////////////////////////////////////////////



using namespace std;

void customerFunction(void);
void AddCust(void);
void DeleteCust(void);
void ViewCust(void);

void invoiceFunction(void);
void invoiceChange(int);

void inventoryFunction(void);
void AddInv();
void DeleteInv();
void ViewInv();
void getSocket(void);



//created a global variable so i am able to use this variable in all the functions
//again, im not sure if this is a legit way of doing it since this is usually inside
//the main
int clientSock;
//char receivedStr[1000];

int main()
{
	
	
	clientSock=socket(AF_INET,SOCK_STREAM, 0);
	
	sockaddr_in serverAddress;
	serverAddress.sin_family=AF_INET;
	serverAddress.sin_port=SERVER_PORT;
	serverAddress.sin_addr.s_addr=inet_addr("128.235.44.71");
	
	connect(clientSock, (struct sockaddr*)&serverAddress, sizeof(struct sockaddr));
	
	//main menu...prints out what to choose from on screen
	int myChoice;

	cout << string(50, '\n');
	string menuChoices[] = {"Customer Information","Inventory Information","Invoice Information","Exit"}; //Choices for the menu
	cout<<"Please choose an option"<<endl;
	for (int i=0;i<4;i++)
	{
		cout<<i+1<<"\t\t"<<menuChoices[i]<<endl; //Prints every choice in the menu
	}
	
	cout<<"(Please enter a number): ";
	cin>>myChoice; //get the choice
	
	
	//calls necessary functions depending on choice made
	switch (myChoice)
	{
		case 1:
			customerFunction(); 
			break;
		case 2:
			inventoryFunction();
			break;
		case 3:
			invoiceFunction();
			break;
		case 4:
			break; 
	}
	//close(clientSock);
	return 0;

}


//the next three functions are the functions calls straight from the main menu
//this function gets called from the main menu. Prompts user if they want to
//add delete or return to main menu. There choice then calls another function
//but i was thinking it might be possible to just leave it all in one function?
void customerFunction()
{
	
	send(clientSock, "Client currently in Customer Function", 500, 0);
	close(clientSock);
	//customer menu with choices to choose from
	cout << string(50, '\n'); //clear screen with blank spaces
	int CustChoice;
	cout<<endl;
	cout<<"What would you like to do?"<<endl;
	cout<<"1.  Add Customer"<<endl;
	cout<<"2.  Delete Customer"<<endl;
	cout<<"3.  View All Customers"<<endl;
	cout<<"4.  Main Menu"<<endl;
	cin>>CustChoice;
	
	//calls specific functions depending on choice made
	//these functions in return should send out SQL data to the server
	switch (CustChoice)
	{
		case 1:
			AddCust();
			break;
		case 2:
			DeleteCust();
			break;
		case 3:
			ViewCust();
			break;
		case 4:
			cout<<"Back to main menu"<<endl;
			//close(clientSock);
			main(); //go back to main which is the main menu
			break;
	}
	
}

//from main menu
void invoiceFunction()
{
	//this does not work
	send(clientSock, "Client currently in Invoice Function", 500, 0);
	
	cout << string(50, '\n'); //clear screen with blank spaces
	
	int InvChoice;
	
	cout<<endl;
	cout<<"What would you like to do?"<<endl;
	cout<<"1.  Create"<<endl;
	cout<<"2.  Search"<<endl;
	cout<<"3.  Main Menu"<<endl;
	cin>>InvChoice;
	
	//calls necessary functions to do action
	switch (InvChoice)
	{
		case 1:
			invoiceChange(InvChoice);
			break;
		case 2:
			invoiceChange(InvChoice);
			break;
		case 3:
			main();
			break;
	}
	
close(clientSock); 
}

//from main menu
void inventoryFunction()
{
	cout << string(50, '\n'); //clear screen with blank spaces
	
	int InvChoice;
	
	cout<<endl;
	cout<<"What would you like to do?"<<endl;
	cout<<"1.  Add"<<endl;
	cout<<"2.  Delete"<<endl;
	cout<<"3.  View"<<endl;
	cout<<"4.  Main Menu"<<endl;
	cin>>InvChoice;
	
	//calls necessary functions to do action
	switch (InvChoice)
	{
		case 1:
			AddInv();
			break;
		case 2:
			DeleteInv();
			break;
		case 3:
			ViewInv();
			break;
		case 4:
			main();
			break;
	}
	
	
}


//these remaining functions are the sub functions being called
//to send SQL data to the server
//I didnt fully code all of it yet since my main concern is getting the sockets working
void AddCust()
{
	
	cout << string(50, '\n'); //clear screen with blank spaces
	string lastName;
	string firstName;
	string StreetAddress;
	string city;
	string state;
	int zipcode;
	int phoneNumber;
	
	cout<<"Please fill out the appropriate fields:"<<endl;
	cin.ignore();
	
	cout<<"Last Name: ";
	getline(cin,lastName);
	
	cout<<"First Name: ";
	getline(cin,firstName);
	
	cout<<"Street Address: ";
	getline(cin,StreetAddress);
	
	cout<<"City: ";
	getline(cin,city);
	
	cout<<"State: ";
	getline(cin,state);
	
	cout<<"Zipcode: ";
	cin>>zipcode;
	
	cout<<"Phone Number: ";
	cin>>phoneNumber;
	
}


void DeleteCust()
{
	//getSocket();	
	//send(clientSock, "I am here to delete a customer", 500, 0);
	cout<<"chose to delete customer";
	//close(clientSock);
}

void ViewCust()
{
	cout<<"chose to view customer";	
}

void invoiceChange(int num)
{	
	if(num==1)
	{
		cout<<"Chose to Create"<<endl;
	}
	else 
	{
		cout<<"Chose to Search"<<endl;
	}	
}

//not fully developed
void AddInv()
{
}
void DeleteInv()
{
}
void ViewInv()
{
}

this is the server cpp file just to verify connection to the server but a lot of the messages i try to send to the server does not send:

// This program implements a TCP Server 

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

using namespace std;

/* This is port number that the server will listen to.
   This port number must be used in the client */
#define SERVER_PORT htons(63513)

int main() {
	
	char receivedStr[1000];

	/* create socket */
	int serverSock=socket(AF_INET, SOCK_STREAM, 0);

	/* Create sockaddr_in structure for the server socket.  
           INADDR_ANY means accept a connection on any of this host's IP addresses*/
	sockaddr_in serverAddr;
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = SERVER_PORT;
	serverAddr.sin_addr.s_addr = INADDR_ANY;

	/* bind (this socket, local address, address length)
           bind server socket (serverSock) to server address (serverAddr).  
           Necessary so that server can use a specific port */ 
	bind(serverSock, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr));

	// wait for a client
	/* listen (this socket, request queue length) */
	listen(serverSock,4);

	// Do forever 
	while (1 == 1) {
		
		// accept a connection request from client
		/* First, create a sockaddr_in struct to hold the address of the client.  
                   Then, create a NEW socket (called clientSock) to talk to the client and connect it to the client socket.   
                   accept (old socket, client socket address, length of client socket address)*/  
		sockaddr_in clientAddr;
		socklen_t sin_size=sizeof(struct sockaddr_in);
		int clientSock=accept(serverSock,(struct sockaddr*)&clientAddr, &sin_size);

		//receive a message from a client
		recv(clientSock, receivedStr, 500, 0);
		cout << "Server received:  " << receivedStr << endl;
		
		close(clientSock);
		}
	return 0;
	}

Recommended Answers

All 3 Replies

Connecting to a MySql database manually is not the way to go...Download the MySql developer files and use that library(MySql's).

Note the enclosed code

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <mysql.h>//Note the mysql header file

#define SEL_QUERY "select * from personal where lastname = '"
#define SQUOTE "'"
#define FIELD_SIZE 35

int main(int argc, char**argv)
{
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;

	bool foundit = false;

	char user[] = "root";
	char password[] = "";
	char database[] = "gerarddb";
	char server[] = "localhost";
	
	char query[strlen(SEL_QUERY) + strlen(SQUOTE) + FIELD_SIZE];
	query[0] = '\0';

	strcat(query, SEL_QUERY);
	strcat(query, argv[1]);
	strcat(query, SQUOTE);

	conn = mysql_init(NULL);

	if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
	{
		fputs(mysql_error(conn), stderr);
		exit(EXIT_FAILURE);
	}

	if (mysql_query(conn, query))
	{
		fputs(mysql_error(conn), stderr);
		exit(EXIT_FAILURE);
	}

	res = mysql_use_result(conn);

	while ((row = mysql_fetch_row(res)) != NULL)
	{
		foundit = true;
		fprintf(stdout, "%s,%s,%s,%s,%s,%s\n",row[0],row[1],row[2],row[3],row[4],row[5]);
	}

	if ( !foundit )
	{
		fprintf(stderr, "'%s' produced an empty dataset!\n", argv[1]);
	}

	mysql_free_result(res);
	mysql_close(conn);
	exit(EXIT_SUCCESS);
}

I am currently reading up on MySQL C API . Like shown, i have my client written in c++ but the API is written in C. Is it possible to put the C code within my c++ client? I am using Xcode on my MAC.

Im new to all of this so please don't be hard on me.

I am currently reading up on MySQL C API . Like shown, i have my client written in c++ but the API is written in C. Is it possible to put the C code within my c++ client? I am using Xcode on my MAC.

Im new to all of this so please don't be hard on me.

Yes, you can use the C api in a C++ application.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.