Socket Programming, step out of the neophyte stage. CPP version

5 replies [Last post]
revall
revall's picture
Offline
SX VIP
Joined: 2014/09/29

One of the most important ascpects in programming is to be able to let your programms talk to, configure, or monitor networks. This can be used to test a servers conectivity on the fly, or set up a server on a target machine so you can connect to it remotely.

You will not always have access to a tool that someone else made. So my hopes with this tut is that you can learn to roll your own tools out on the fly. I will start these string of tuts out with a simple tcp client. This program will send an HTTP request to a server and listen for a response. This is a good way to quickly test the status of a server.

Read each line of code, and the comments should help explain what each line does. There will be a more detailed tut for this on Turorials page. This is also where I will post all following tutorials.

Lets get started:

NOTE: The Code following is for linux.

CPP code

#include <iostream>
#include <cstring>
#include <sys/socket.h> //Needed to create the socket. Gives access to system commands for sockets
#include <netdb.h> //Needed for socket
#include <unistd.h> //Since gcc 4.7 you now need this to close socket

using namespace std;

int main()
{
    int connStatus; //Store the status for the server info population
    struct addrinfo host_info;  // The struct that getaddrinfo() uses
    struct addrinfo *host_info_list; // Set up a list for different host infos
   
    //0 fill the struct. Make sure there is no bad data
    memset(&host_info, , sizeof host_info);
   
    //Set up the Structs for the Server Data.
    cout << "Setting server data into the addrinfo struct.\n\n";

    host_info.ai_family = AF_INET; //Set IP to handle TCP Connections
    host_info.ai_socktype = SOCK_STREAM;  //Sets the socket type to acccept TCP transmission

    connStatus = getaddrinfo("google.com", "80", &host_info, &host_info_list); //Populates the structs with addrinfo of google on port 80

     //Check if we were able to get data from the server
    if(connStatus == ) cout << "Connection information populated successfuly\n\n";
    else if(connStatus != ) cout << "Connection error: " << gai_strerror(connStatus) << endl;

    cout << "Creating the socket now...";

    int sock; //Descriptor for our socket

    sock = socket(host_info_list->ai_family, host_info_list->ai_socktype, host_info_list->ai_protocol); //Opens internet socket with host, type, and protocol. This was all populated by getaddrinfo().

    //Make sure the sock was created
    if(sock == -1) cout << "Socket Error: " << endl; //Need to put error reporting in still
    else cout << "Socket Created\n\n";

    cout << "Connecting to the server...";
    //Pass the connection code the Socket, the Address, and the Address length. return connection status
    connStatus = connect(sock, host_info_list->ai_addr, host_info_list->ai_addrlen);
    if(connStatus == -1) cout << "Connection Error: " << endl;
    else cout << "You are now connected.\n\n";

    cout << "Sending Data... \n\n";
    //Msg to be sent
    char *msg = "GET / HTTP/1.1\nhost: www.google.com\n\n";

    int length; //Initialize msg lenghth
    ssize_t bytesSent; //initialize bytesSent as a ssize_t
    length = strlen(msg); //get length of msg for the buffer
    //Tie to socket, send msg, give it the msg length for the buffer and set flags to 0. these are the same as write() function.
    bytesSent = send(sock, msg, length, );

    //Then we need to receive the data back from server
    //The recv func will wait for a response to system.

    cout << "Waiting to recieve data... \n";
    ssize_t bytesReceived;
    char buffer[5000]; //Set up a buffer to recveive data
    bytesReceived = recv(sock, buffer, 5000, ); //Recv data
    if(bytesReceived == ) cout << "Host disconnected.\n";
    if(bytesReceived == -1) cout << "Connection error\n";
    cout << bytesReceived << " bytes received :" << endl ;
    cout << buffer << endl;

    //If you open a door close it
    cout << "Transaction success. Closing socket...\n";
    freeaddrinfo(host_info_list); //Releases host information from memory
    close(sock); //Closes the open socket on port 80

    //That does it for this round. Not to bad to understand once you break it down.
}

Welcome, neophyte, to the real world.

Stay tuned for a python equivalent, and more tuts like this one with more advanced topics.
Plus if you have any request for tuts in this feild comment bellow to request it.
-revall