Ben c’est vrai que c’est tentant et si la prog te gonfle, c’est normal en C++ B) la tu vas t’en tirer avec une page et demi de code, voire deux ou trois si tu dois gerer different encoding, alors que tu peux faire ca en quelques lignes en C#.
Histoire d’etre utile, exemple en C++ repompe/adapte d’ailleurs a pas prendre a la lettre c’est pour donner une vague idee de la maniere dont ca marche
[code]#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include
…
int socketDescriptor;
unsigned short int serverPort;
struct sockaddr_in serverAddress;
struct hostent *hostInfo;
hostInfo = gethostbyname(“192.168.2.1”);
if (hostInfo == NULL) {
cout << "problem interpreting host: " << buf << “\n”;
exit(1);
}
// Create a socket.
socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
if (socketDescriptor < 0) {
cerr << “cannot create socket\n”;
exit(1);
}
serverAddress.sin_family = hostInfo->h_addrtype;
// risque de buffer overflow scandaleux… controlle des trucs a rajouter clairement… m’enfin bon on va vite la
memcpy((char *) &serverAddress.sin_addr.s_addr,
hostInfo->h_addr_list[0], hostInfo->h_length);
serverAddress.sin_port = htons(100);
if (connect(socketDescriptor,
(struct sockaddr *) &serverAddress,
sizeof(serverAddress)) < 0) {
cerr << “cannot connect\n”;
exit(1);
}
… truc a envoyer dans buf … demerde toi pour le mettre dans un byte[] qui tient la route en fonction de l’encoding…
if (send(socketDescriptor, buf, strlen(buf) + 1, 0) < 0) {
cerr << "cannot send data ";
close(socketDescriptor);
exit(1);
}
… recevoir …
if (recv(socketDescriptor, buf, MAX_LINE, 0) < 0) {
cerr << “didn’t get response from server?”;
close(socketDescriptor);
exit(1);
}
close(socketDescriptor);
return 0;[/code]
En C# pour comparer:
[code]using System;
using System.Net;
using System.IO;
using System.Text;
…
try {
TcpClient client = new TcpClient(“192.168.2.1”, 100);
byte[] data = Encoding.ASCII.GetBytes(“rulez”);
NetworkStream stream = client.GetStream();
// envoyer…
stream.Write(data, 0, data.Length);
// recevoir et recreer un objet string avec l’encodage qu’il faut
data = new byte[256];
int bytesRead = stream.Read(data, 0, data.Length);
string responseData = Encoding.ASCII.GetString(data, 0, bytes);
stream.Close();
client.Close();
} catch (SocketException ex)
{
Console.WriteLine("Rhaa ca foire " + ex.ToString());
}[/code]
Bon le code en C# fait plus que celui en C++ mais bon… on pourait aussi betement creer un BinaryWriter sur le NetworkStream si les deux cotes sont en C# ce qui serait encore plus simple, et se finirait avec une ligne genre bw.WriteString(“mon xml”) directement pour envoyer et string lecture = br.ReadString() mais la on se la joue roots bas niveau en C#…
(Disclaimer de chie: Bien sur aucun des deux code n’est parfait ou ne doit etre utilise tel quel il manque des choses B) c’est juste pour donner une idee et en plus aider, et faire de la pub! Trois en un.)