Sockets

cs_danyclassique Messages postés 94 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 7 novembre 2010 - 2 mai 2009 à 21:56
cs_danyclassique Messages postés 94 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 7 novembre 2010 - 17 mai 2009 à 17:34
Bonjour a tous,
J essaie de creer le processus d' un chat en envoyant un petit texte de test pour l instant d un pc a l autre.
J avais deja cree un chat complet qui fonctionne tres bien en local c est a dire pc a pc mais sur le meme reseau  Maintenant j essaie de le faire sur deux reseaux different
Explicatif:

J ai deux classes tres simple une server et une client que j ai repris sur le site code projet pour juste les besoins du test

sur un pc a paris il y a le server
sur un pc a venise il y a le client
et quand chaque pc insere l ip respectif du pc distant comme quand je test le tout en local cela ne fonctionne pas

J ai essaye de chercher sur le net et on parle beaucoup d' ip local comme j ai deja reussi a faire mais des qu il s' agit d ip public ca devient moins facile a trouver.
Peut etre quelqu'un pourrait m'aider ou me diriger vers une solution a ce probleme

voici les deux classes

server:

public

static
void Main(){

try{

IPAddress ipAd =
IPAddress.Parse(
"93.173.140.235");
//use local m/c IP address, and use the same in the client

/* Initializes the Listener */

TcpListener myList =
new
TcpListener(ipAd, 8001);

/* Start Listeneting at the specified port */myList.Start();

Console.WriteLine(
"The server is running at port 8001...");

Console.WriteLine(
"The local End point is :" + myList.LocalEndpoint);

Console.WriteLine(
"Waiting for a connection.....");

Socket s = myList.AcceptSocket();

Console.WriteLine(
"Connection accepted from " + s.RemoteEndPoint);

byte[] b =
new
byte[100];

int k = s.Receive(b);

Console.WriteLine(
"Recieved...");

for (
int i = 0; i < k; i++)

Console.Write(
Convert.ToChar(b[i]));

ASCIIEncoding asen =
new
ASCIIEncoding();s.Send(asen.GetBytes(

"The string was recieved by the server."));

Console.WriteLine(
"\nSent Acknowledgement");

/* clean up */s.Close();

myList.Stop();

}

catch (
Exception e){

Console.WriteLine(
"Error..... " + e.StackTrace);}

}

client:

public

static
void Main(){

try{

TcpClient tcpclnt =
new
TcpClient();

Console.WriteLine(
"Connecting.....");tcpclnt.Connect(

"93.173.140.235", 8001);
// use the ipaddress as in the server program

Console.WriteLine(
"Connected");

Console.Write(
"Enter the string to be transmitted : ");

String str =
Console.ReadLine();

Stream stm = tcpclnt.GetStream();

ASCIIEncoding asen =
new
ASCIIEncoding();

byte[] ba = asen.GetBytes(str);

Console.WriteLine(
"Transmitting.....");stm.Write(ba, 0, ba.Length);

byte[] bb =
new
byte[100];

int k = stm.Read(bb, 0, 100);

for (
int i = 0; i < k; i++)

Console.Write(
Convert.ToChar(bb[i]));tcpclnt.Close();

}

catch (
Exception e){

Console.WriteLine(
"Error..... " + e.StackTrace);}

}

je vous remercie d avance pour votre aide

4 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
3 mai 2009 à 10:31
Bonjour,

Tout d'abord il te faut verifier si les IP sont accessibles (Ping ?)
Verifie les par-feu, ceux des PC et ceux des appareil de connexion (....Box).
Si les IP sont accessibles il n'y a pas de raison que cela ne fonctionne pas.

C# is amazing, enjoy it!
0
cs_danyclassique Messages postés 94 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 7 novembre 2010
3 mai 2009 à 11:58
bonjour,
merci pour ta reponse j ai deja verifie les parefeux et les appareils de connexion a mon niveau .
Je vais faire de meme sur le pc distant
Je reviens vers toi des que j ai du nouveau
cordialement
dany
0
cs_danyclassique Messages postés 94 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 7 novembre 2010
17 mai 2009 à 01:35
Bonjour robert33,


Desole pour le temps tardif de ma reponse.


J ai reussi a comprendre le systeme d un routeur ,ce qu il me manquait ,pour comprendre tout cela.


apres verif je me suis apercu que mon programme marchait tres bien sauf que je l utilisais mal au niveau de l insertion des address ip de chaque ordi
J en ai profite pour augmenter un peut l utilite du programme en transmettant le bureau de l un sur l autre avec pour l instant juste le visu du bureau sans la prise en compte des evenements de la souris et du clavier cela on verra beaucoup plus tard
Ca fonctionne tres tres bien encore une fois en reseau local et en resau distant ,mon probleme, n est plus d ordre de connection mais d interpretation des image au niveau je pense du rgb je crois.
J ai teste mon nouveau programme comme un chat en reseau distant et il fonctionne tres bien mais des que j envoie les images ca marche sauf que l ecran du receveur est tout noir .

Je t envoi juste les partis client serveur de la transmition

client


Stream fs;




private





void

button1_Click(


object

sender,


EventArgs

e)



{




TcpClient

tc =


new





TcpClient

(textBox1.Text,2112);





NetworkStream

ns = tc.GetStream();





byte

[] b = CaptureTotale();









ns.Write(b, 0, b.Length);



}


[





DllImport

(


"user32.dll"

)]



private





static





extern





IntPtr

GetDesktopWindow();[



DllImport

(


"gdi32.dll"

)]



private





static





extern





bool

BitBlt(



IntPtr

hdcDest,



int

nXDest,



int

nYDest,



int

nWidth,



int

nHeight,



IntPtr

hdcSrc,



int

nXSrc,



int

nYSrc,



int

dwRop);



private





const





int

SRCCOPY = 0xCC0020;








public





byte

[] CaptureTotale(){



IntPtr

handle = GetDesktopWindow();



Graphics

gScreen =


Graphics

.FromHwnd(handle);



Rectangle

r =


Screen

.PrimaryScreen.Bounds;



Bitmap

bmpScreen =


new





Bitmap

(r.Width, r.Height);



Graphics

gBmp =


Graphics

.FromImage(bmpScreen);



IntPtr

hDCScreen = gScreen.GetHdc();



IntPtr

hDCBmp = gBmp.GetHdc();BitBlt(hDCBmp,

0,

0,

r.Width,

r.Height,

hDCScreen,

0,

0,

SRCCOPY);

gScreen.ReleaseHdc(hDCScreen);

gBmp.ReleaseHdc(hDCBmp);



MemoryStream

ms =


new





MemoryStream

();


bmpScreen.Save(ms, System.Drawing.Imaging.





ImageFormat

.Png);

 



byte

[] b = ms.GetBuffer();












return

b;}



serveur













private





void

button1_Click(


object

sender,


EventArgs

e){



Thread

th =


new





Thread

(


new





ThreadStart

(Listen));th.Start();

}



byte

[] b;



int

k;



public





void

Listen(){



Socket

Listener =


new





Socket

(


AddressFamily

.InterNetwork,


SocketType

.Stream,


ProtocolType

.Tcp);Listener.Bind(



new





IPEndPoint

(


IPAddress

.Any,2112));Listener.Listen(0);



Socket

s = Listener.Accept();



Stream

netStream =


new





NetworkStream

(s);



 














// Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });





b =





new





byte

[20000000];k = s.Receive(b);



 


pictureBox1.Image =





new





Bitmap

(


new

System.IO.


MemoryStream

(b));


s.Close();


Listener.Close();


}




public









void

UpdateDisplay(string

text){



// textBox2.Text = text;


}








protected





delegate





void





UpdateDisplayDelegate

(


string

text);

La fonction updateDisplay etait pour le test de l envoi de text n y fais pas attention





Ce n est juste que pour te monter le code de maniere a te donner une idee de ma demarche au niveau de l envoi
mais dans mon reel programme il y a evidement un timer des sleep et une gestion des pointeurs entre deux images pour en deduire la difference et ainsi envoyer la difference et pas a chaque fois toutes les images complete
et d ailleurs ce systeme de pointeurs m avait ete commente par deus membres de ce site  ce qui m a ensuite permis de le finir et de le mettre en oeuvre

voila

Peut etre aurai eu une idee
Dans l attente d un retour je te remercie ou remercie tous ceux qui pourraient eventuellement m aider
cordialement
dany
0
cs_danyclassique Messages postés 94 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 7 novembre 2010
17 mai 2009 à 17:34
Bonjour a tous
voila j ai enfin trouve le gros probleme entre le local et le distant
tous comptes fait j ai repris le system du BinaryFormatter pour serializer et deserialiser le transport de donnees

mais en utilisant cette technique j avais un probleme sur le reseau distant alors qu en reseau local cela fonctionnait

Alors pour ceux a qui ca interresse le probleme vient d un manque de comptabilite entre les frameworks installees sur chaque pc
et cela genere une erreur qui etait
Exception Message: Binary stream '0' does not contain a valid BinaryHeader. Possible causes are invalid stream or object version change between serialization and deserialization

pour remedier au probleme j ai vu sur un excelent tuto et sur un excelent site la solution .

nous avons trois possibilites de methode
la premiere c est de mettre la meme framework sur chaque pc
la deuxieme est a mon avis la plus adaptee et est de preciser la propriete  TypeFormat du BinaryFormatter a FormatterTypeStyle
.XsdString;
La troisieme vous pouvez aller voir le site directement et les explications sont vraiement tres completes
voici le lien
http://kbalertz.com/947983/Binary-serialization-exceptions-occur-serialize-deserialize-DateTimeFormatInfo-class-TextInfo-class-between-different-versions-Framework.aspx

voila merci en tout cas a robert33 pour ton aide qui m a permit de me concentrer sur le fonctionnement de l adressage d un routeur et qui , par la suite, savoir comment employer les sockets a cet effet

J essaierai quand le programme sera termine de le mettre sur ce site pour ceux a qui cela interresse .
Je precis que pour l instant j enverai juste la version du visu sans les evennements de la souris et du clavier car cela risque de me prendre du temps vu la difficulte du probleme car je fais ca en parrallele de mon travail

cordialement

dany
0
Rejoignez-nous