Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a basic C/C++ TCP socket writer

Tags:

c++

c

tcp

sockets

Below is the following basic socket code I came up with:

//General includes:
#include <iostream>
#include <stdio.h>
#include <string>

//Network related includes:
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

//Target host details:
#define PORT 1234
#define HOST "74.74.74.74"

using namespace std;

//Function prototypes:
string MessageFormat(int, char**);
void MessageSend(string);

int main(int argc, char *argv[])
{
    //Parse arguments and format message:
    string message = MessageFormat(argc, argv);

    //Send the message out: 
    MessageSend(message);

    return 0;
}

string MessageFormat(int argc, char *argv[])
{
    //Massage the command line parameters
    // into my desired payload format.

    return message;
}

void MessageSend(string message)
{
    int sd, ret;
    struct sockaddr_in server;
    struct in_addr ipv4addr;
    struct hostent *hp;

    sd = socket(AF_INET,SOCK_DGRAM,0);
    server.sin_family = AF_INET;

    inet_pton(AF_INET, HOST, &ipv4addr);
    hp = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET);
    //hp = gethostbyname(HOST);

    bcopy(hp->h_addr, &(server.sin_addr.s_addr), hp->h_length);
    server.sin_port = htons(PORT);

    connect(sd, (const sockaddr *)&server, sizeof(server));
    send(sd, (char *)message.c_str(), strlen((char *)message.c_str()), 0);
}

This is quite basic, and does in fact work. HOWEVER, it's sending UDP packets instead of TCP packets, so the target host expecting TCP rejects these. Also, by inspecting connect/send values and watching my interfaces with ngrep I can 100% verify the packet is going out, so that's not the issue.

I'm only interested in modifying what I have, not creating a full featured server with boost asio. How can I tweak this so that it operates in terms of TCP instead of UDP?

like image 760
kmarks2 Avatar asked May 10 '13 16:05

kmarks2


People also ask

What is socket () in C?

DESCRIPTION. The socket() function shall create an unbound socket in a communications domain, and return a file descriptor that can be used in later function calls that operate on sockets. The socket() function takes the following arguments: domain. Specifies the communications domain in which a socket is to be created ...

What is TCP socket programming?

A socket programming interface provides the routines required for interprocess communication between applications, either on the local system or spread in a distributed, TCP/IP based network environment. Once a peer-to-peer connection is established, a socket descriptor is used to uniquely identify the connection.


1 Answers

Following are changes you need to make to transfer data via TCP

  1. While creating socket pass correct parameters .In above example you passed SOCK_DGRAM instead pass SOCK_STREAM.

  2. After binding server should go into listen mode (check the manual page of listen) while Client Side should connect after socket creation.

  3. Then accept in server side after listen.

  4. Final Read and write to transfer data

Diagram attached will give you a clear picture of TCP connection

TCP Socket programming

You can check manual pages for detailed info on all functions or refer beej's guide for socket programming ( use this link )

like image 102
Mayank Jain Avatar answered Sep 29 '22 03:09

Mayank Jain