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