web-dev-qa-db-fra.com

Création d'un écrivain de socket C / C ++ TCP

Voici le code de socket de base suivant que j'ai trouvé:

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

Ceci est assez basique et fonctionne en fait. CEPENDANT, il envoie des paquets UDP au lieu de TCP paquets, donc l'hôte cible qui attend TCP les rejette. Aussi, en inspectant les valeurs de connexion/envoi et en regardant mes interfaces) avec ngrep, je peux vérifier à 100% que le paquet sort, donc ce n'est pas le problème.

Je souhaite seulement modifier ce que j'ai, pas créer un serveur complet avec boost asio. Comment puis-je modifier cela pour qu'il fonctionne en termes de TCP au lieu d'UDP?

16
kmarks2

Voici les modifications que vous devez apporter pour transférer des données via TCP

  1. Lors de la création du socket, passez les paramètres corrects. Dans l'exemple ci-dessus, vous avez passé SOCK_DGRAM à la place, passez SOCK_STREAM.

  2. Après la liaison, le serveur doit passer en mode d'écoute (consultez la page de manuel d'écoute) tandis que le côté client doit se connecter après la création du socket.

  3. Acceptez ensuite côté serveur après écoute.

  4. Lecture et écriture finales pour transférer des données

Le diagramme ci-joint vous donnera une image claire de la connexion TCP

TCP Socket programming

Vous pouvez consulter les pages de manuel pour des informations détaillées sur toutes les fonctions ou consulter le guide de beej pour la programmation des prises (utilisez this link)

24
Mayank Jain

Remplacer SOCK_DGRAM avec SOCK_STREAM.

Aussi, lire le manuel ou obtenir un bon livre .

7
Useless