Problem De Socket [ send() ]

Signaler
Messages postés
47
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
23 avril 2007
-
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Voila jai fait un petit programme qui se connecte à 2 serveur irc differents ( bia 2 socket en thread ).
Je voudrais que l'orsque un des deux serveur recoit une donnée, il l'envoy à l'autre serveur ( via le second socket );
Exemple:
{
Socket_1 = socket (AF_INET, SOCK_STREAM, 0);
....
Socket_2 = socket (AF_INET, SOCK_STREAM, 0);
...
}
...
{
...
taille_recu = recv (Socket_1, msg_recu, 1024, 0);
msg_recu[taille_recu] = 0;
send (Socket_2, "looOOOl", strlen ("looOOOl"), 0);
}
Malheuresement ca ne marche Pas :/ je narrive pas a envoyer au socket_2 depuis la reception des données du socket_1

Merci de votre aide,
J'espere avori été claire

3 réponses

Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
salut,

tu as été clair, mais il manque les 3/4 du code ... la connexion de
socket_2 ne doit pas etre correcte, mais la, personne ne va pouvoir
t'aider si tu ne copies colles rien ...



a+
Messages postés
47
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
23 avril 2007

Voila la casi totalité de la source:

int main(int argc, char *argv[])
{
WSADATA Data;
WSAStartup (MAKEWORD (2, 2), &Data);
/*<--**-*--*/
HANDLE hThreadd = 0;
HANDLE hThread = 0;
DWORD dwThreadd = 0;
DWORD dwThread = 0;
HANDLE hThreadServ = 0;
DWORD dwThreadServ = 0;
/*<--**-*--*/
while (1) {
hThreadServ = CreateThread(NULL, 0, connexion_tcp, "irc.fr.worldnet.net", CREATE_SUSPENDED, &dwThreadServ);
if (hThreadServ) { ResumeThread(hThreadServ); }
while (hThreadServ) {
hThreadd = CreateThread(NULL, 0, connexion_tcp, "irc.voila.fr", CREATE_SUSPENDED, &dwThreadd);
if (hThreadd) { ResumeThread(hThreadd); }
hThread = CreateThread(NULL, 0, connexion_tcp, "irc.voila.fr", CREATE_SUSPENDED, &dwThreadd);
if (hThread) { ResumeThread(hThread); WaitForSingleObject(hThread, INFINITE); }
//Connexion_tcp("irc.voila.fr");
sleep(10000);
}
}
return 0;
}
**************************************************************
**************************************************************
int
connexion_tcp (char *serv)
{
SOCKADDR_IN SinDist;
struct hostent *host;
int sock;
sock = socket (AF_INET, SOCK_STREAM, 0);
SinDist.sin_family = AF_INET;
SinDist.sin_addr.s_addr = inet_addr (serv);
SinDist.sin_port = htons (6667);
if (SinDist.sin_addr.s_addr == -1)
{
host = gethostbyname (serv);
memcpy ((char *) &SinDist.sin_addr.s_addr, host->h_addr, host->h_length);
}
if (connect (sock, (struct sockaddr *) &SinDist, sizeof (SOCKADDR_IN)) < 0)
{
return -1;
}
Irc_Bot(sock,serv);
return 0;
}
**************************************************************
**************************************************************
void Irc_Bot(int sock,char *serv) {
int Bot1;
int Bot2;
if (!strncmp (strlwr(serv), "irc.fr.worldnet.net", 15) == 0) {
if ((Bot1 != sock) && (Bot2 != sock)) { Bot1 = sock; }
else { Bot2 = sock; }
}


Get_New_Nick(sock,serv);
int taille_recu;
char msg_recu[1025];
int taille_recue;
char msg_recue[1025];
char pong[50];
char Say_Chan[1024];
char Say_Chan_Chan[1024];
char Say_Notice[1024];
char Notice_Dest[1024];
char Say_Ctcp[1024];
char Ctcp_Dest[1024];
char Part_Chan[1024];
char Part_Chan_Chan[1024];
char Join_Chan[1024];
char Part_Quit[1024];
char Nick_Change[30];
char HostReg[1000];
char RegList[1000];
while (1) //Boucle infinie qui recoit les données
{
debut:;
taille_recu = recv (sock, msg_recu, 1024, 0);
msg_recu[taille_recu] = 0;
if (strncmp (strlwr(serv), "irc.fr.worldnet.net", 18) == 0) { MessageBox (NULL, msg_recu,"recue",NULL); }
if (!msg_recu) { goto debut; } if ((strncmp (msg_recu, ":irc.voila.fr 498", 17) 0) || (strncmp (msg_recu, ":irc.voila.fr 433", 17) 0) || (strncmp (msg_recu, ":irc.voila.fr 432", 17) == 0)) { Get_New_Nick(sock,serv); }
char *Nick = parser_get_nick(msg_recu);
char *Ident = parser_get_ident(msg_recu);
char *Host = parser_get_host(msg_recu);
char *Destination = parser_get_dest(msg_recu);
char *Commande = parser_get_cmd(msg_recu);
char *Message = parser_get_buf(msg_recu);
char *Pong = parser_get_pong(msg_recu);
if (strncmp (msg_recu, "PING", 4) == 0) {
sprintf (pong, "PONG :%s\n",Pong);
send (sock, pong, strlen (pong), 0);
}
if (strstr (msg_recu, ":End of /MOTD command.")) {
send (sock, "JOIN #ALFONSE\n", strlen ("JOIN #ALFONSE\n"), 0);
} if ((Commande) && (strncmp (Commande, "PRIVMSG", 7) 0) && (strncmp (Destination, "#", 1) 0) && (strncmp (strlwr(serv), "irc.fr.worldnet.net", 18) == 0)) {
if (strncmp (Message, ".say", 4) == 0) {
char *Say = strtok(Message, " ");
Say = strtok( NULL," ");
sprintf (Say_Chan_Chan,"%s",Say);
Say = strtok( NULL,"\n");
if (!Say) { goto debut; }
sprintf (Say_Chan,"PRIVMSG %s :%s\n",Say_Chan_Chan,Say);
send (Bot1, Say_Chan, strlen (Say_Chan), 0);
send (Bot2, Say_Chan, strlen (Say_Chan), 0);
/* voila les erreurs; au lieu de menvoyer les commandes sur les socket bot1 et bot2 (irc.voila.fr), il menvoi le tout sur le socket irc.fr.worldnet.net */
}
}
}
}
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
"au lieu de menvoyer les commandes sur les socket
bot1 et bot2 (irc.voila.fr), il menvoi le tout sur le socket
irc.fr.worldnet.net"



c'est normal, les sockets Bot1 et Bot2 désignent ton socket principal ...

(cf le debut de ta procedure Irc_Bot : { Bot1 sock; } else { Bot2 sock; })



en fait tu t'es emmelé completement les pinceaux :) (d'ailleurs
pourquoi crées tu deux threads qui se connectent sur irc.voila.fr ?? si
tu fais deux fois createthread, tu auras deux threads et non pas un
seul)



le plus simple il me semble est de créer deux sockets qui seront des variables globales .



SOCKET sock_voila;

SOCKET sock_worldnet;



ensuite depuis ton thread worldnet, tu envoies ce que tu veux sur sock_voila.

A toi de reperer que quand le nom du serveur est voila, tu utilises sock_voila, et sinon tu utilises sock_worldnet.



sers toi egalement de noms de variables qui ont un sens plus important !!!

(ex hThreadVoila ou hThreadWorldnet au lieu de hThreadd ...)



si tu as besoin de plus d'aide ou que j'ai pas été assez clair, hésite pas

a+