Envoi d'un message à un otre Ordi (réseau)

cyberlewis Messages postés 50 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 20 février 2005 - 14 sept. 2004 à 20:57
cyberlewis Messages postés 50 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 20 février 2005 - 15 sept. 2004 à 22:30
Salut,

Voilà, après avoir (presque) tout essayer avec les Sockets, je cherche de l'aide svp :

Mon but est de faire deux logiciels identiques, un sur le PC A, l'otre sur le PC B ...

Si sur le PC A je met dans le log, l'ip du PC B, je peux envoyer un message texte, et donc le recevoir avec B.

Ceci doit marcher aussi pour le B, et même avec autant de PC qu'il le faut, en tapant son IP ...

Merci d'avance pour toute aide ...

11 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 sept. 2004 à 21:16
Salut,
Et c'est ou que tu bloques ?
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
14 sept. 2004 à 21:54
Regarde dans mes sources tu trouveras un exemple tout ce qu'il y a de plus simple pour etablir une connexion entre deux pc via les sockets.

Voici l'url :
http://www.cppfrance.com/code.aspx?id=21303

Shell
0
cyberlewis Messages postés 50 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 20 février 2005
14 sept. 2004 à 23:00
Merci poir vos réponses,

Un truc que j'ai pas compris par contre ...

Si j'ai 5 PC, A, B, C, D, E ayant le log lancé (je dois mettre client ou serveur pour le log) ?

Les 5 PC doivent pouvoir communiquer entre eux,

Je dois faire deux thread ds le logiciel ? (un pour le serveu, l'autre pour le client) ?

@+
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 sept. 2004 à 23:08
Salut,
Pour la question sur les threads: non tu as des modeles d'utilisation de winsock qui te permettent de gerer plusieurs connections dans un seul thread (select, WSAAsyncSelect).

Pour l'autre question... j'ai pas bien compris.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cyberlewis Messages postés 50 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 20 février 2005
14 sept. 2004 à 23:43
En fait, je n'ai pas compris un truc fondamental,

Ex : J'ai 3 PC, sur n'importe quel PC, si je tape une IP, mon but est que j'envoie un message TEXTE vers cette IP (qui dispose du programme)

Sur le principe du PEER-TO-PEER donc je pense,

Comment puis-je fire un SERVEUR CLIENT s'il ya 3 PC ? Qui en serveur ? Qui en client ? C'est ça que je comprends pas "serveur client",

Mon but est biensûr de faire comme Winpopup si vous connaissez, mais avec des IP ...

Thx pr toute aide
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 sept. 2004 à 23:54
Salut,
En gros on peut dire que chaque machine joue le role du serveur et du client... mais on parle de modele client/serveur lorsqu'on etablie des connections entres les ordis (protocole TCP). Or dans ton cas tu veux simplement recevoir des messages et envoyer des messages vers plusieurs machines, le protocole UDP est plus adapté (et surtout plus simple).
0
cyberlewis Messages postés 50 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 20 février 2005
15 sept. 2004 à 00:12
Merci pour ta réponse,

Comment faire pour UDP ?

J'ai regardé sur MSDN, il ya un exemple avec WSAStartup, bind( ...
Mais je ne sais pas si c'est TCP ou UDP ? comment envoyer ?

Svp, qu'est ce que je dois faire ?

Mon code (épuré, pas de tests, pas d'include):

WSADATA WSAData; 
WSAStartup( MAKEWORD(2,2), &WSAData );

SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); 

sockaddr_in service; 
service.sin_family = AF_INET; 
service.sin_addr.s_addr = inet_addr( "127.0.0.1" ); 
service.sin_port = htons( 32656 ); 


Après, je ne sais pas comment envoyer des données ...
Et encore moins recevoir/envoyer des données en utilisant le même port (est-ce possible ?)

@+ Thx déjà pr votre aide que vous m'avez apporté :)
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
15 sept. 2004 à 07:57
Dans ton bout de code, c'est du TCP.

Pour mettre les choses au clair, sache que le serveur a pour role d'ouvrir un port sur le pc et d'ecouter sur ce port.
Le client ne fait rien de plus que de se connecter au port spécifié par le serveur.
Ainsi pour mettre deux PC en relations, il te faut 1 Serveur qui crée la connexion et 1 Client qui se connecte.

Ce que aardam a voulu te dire, c'est que dans ton cas, le programme devra faire client et serveur a la fois car tu peux aussi bien lancer une demande de connexion,(client) ou alors attendre une connexion(serveur).

Pour ceux qui est du TCP et de l'UDP, peut importe, mais préfére un bon code utilisant du TCP a un bon code utilisant de l'UDP.
Ces 2 protocole ont une différence majeur.
Comme son nom l'indique le TCP (Transfer Control Protocol), crée une connexion persistante et control les paquets pour assurés une qualité de récéption des données.
A l'inverse l'UDP ne le fait pas.

Si aardam te conseil l'UDP, c'est simplement par en TCP tu ne peux établir qu'une seule connexion sur un meme port, alors qu'en UDP, tu peux établir autant de connexion que tu le souhaite simultanément sur le meme ports et sur le meme IP.

Pour ton cas il serait plus facile de gérer les connexions avec de l'UDP.

Regarde sur CPPFrance, tu trouveras de bon exemple d'application Client/Serveur utilisant de l'UDP.

Shell
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
15 sept. 2004 à 11:30
Utilise le service window pour envoyer des messages, celui de "net send" ;)
1 api ou 2 et c'est parti...!!!

@+ and good dev
0
cyberlewis Messages postés 50 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 20 février 2005
15 sept. 2004 à 15:27
Non, je ne peux pas,

Sinon ça ne marchera pas sur W98 ...

DeAtHCrAsH, MERCI pour ta réponse, je vais voir ça ... pour l'UDP ...

En effet, il me faut absolument plusieurs ports possible, et je n'ai pas besoin de connection persistante (ça serait un défaut même)...

http://www.realtuning.online.fr
0
cyberlewis Messages postés 50 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 20 février 2005
15 sept. 2004 à 22:30
Voilà le code que j'ai fais, par contre il bloque tout, et je ne peux donc rien voir (s'il marche ou pas) ...

SERVEUR :
Code:

// Initialisation de Winsock2
WSADATA WSAData;
WSAStartup( MAKEWORD(2,0),& WSAData );

// Configuration du Socket
SOCKET r_socket;
SOCKADDR_IN r_sin;

int port=6666;

// Configuration du Socket
r_sin.sin_family=AF_INET;
r_sin.sin_addr.s_addr=INADDR_ANY;
r_sin.sin_port=htons(port);

// Initialisation du socket en mode UDP avec SOCK_DGRAM
r_socket=socket( AF_INET, SOCK_DGRAM, 0 );
bind( r_socket,(SOCKADDR*)&r_sin, sizeof(r_sin));

char r_buffer[50];
int r_sin_size=sizeof(r_sin);
int r;

while(1)
{
memset( r_buffer, 0, sizeof(r_buffer));
recvfrom(r_socket, r_buffer, sizeof(r_buffer), 0, (SOCKADDR*)&r_sin, &r_sin_size);
ChatWindow->Lines->Add(r_buffer);

}


CLIENT :
Code:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
// Initialisation de Winsock
WSADATA WSAData;
WSAStartup( MAKEWORD(2,0), &WSAData );

// Initialisation des Sockets
SOCKET s_socket;
SOCKADDR_IN s_sin;

int port;

char ip[16]={ '1', '2', '7', '.', '0', '.', '0', '.', '1', '\0' };
// c juste pr tester ça l'ip comme ça lol ...
port=6666;

// Configuration du Socket
s_sin.sin_family=AF_INET;
s_sin.sin_addr.s_addr=inet_addr(ip);
s_sin.sin_port=htons(port);

// Initialisation du socket en mode UDP avec SOCK_DGRAM
s_socket=socket( AF_INET, SOCK_DGRAM, 0);
bind(s_socket, (SOCKADDR*)&s_sin, sizeof(s_sin));

// Envoi des données
char s_buffer[50]={ 'l', 'o', 'o', '\0' };
while(1)
{
memset( s_buffer, 0, sizeof(s_buffer));
ChatWindow->Lines->Add("Envoyer des données");
sendto( s_socket, s_buffer, sizeof(s_buffer), 0, (SOCKADDR*)&s_sin, sizeof(s_sin));

}



Svp, savez-vous comment rendre ce code non blanquant de la façon la plus simple et la plus efficace (pour l'utilisateur) qui soit ?

Pas que ça utilise 100% du CPU ... en fait ...

@+ THX

PS : Ce log est un log, ou on peut enoyer un message texte à une IP via un port bien précis (local ou internet), si l'otre possède le même log ...

C'est donc une communication dans les deux sens ...
0
Rejoignez-nous