Accueil > > > PROXY IRC SIMPLE (WINDOWS/WINSOCK)
PROXY IRC SIMPLE (WINDOWS/WINSOCK)
Information sur la source
Description
Proxy IRC, permettant de créer un log des communications entre le client et le serveur. La connexion avec le serveur est initialisée dès qu'un client se connecte. Dès lors, tous les échanges sont redirigés sur la sortie standard. Les logs se visualisent difficilement avec WordPad mais assez bien avec Bloc Note. Si cela vous gène, n'hésitez pas à envoyer un mail à Microsoft pour leur expliquer à quel point leur crlf fait chier tout le monde. Compilé avec Microsoft Visual Studio 2008 - Professional Edition. Options de compilation par défaut d'un projet Win32 console vide sauf : - Character Set : No Set - C/C++ -> Warning Level : Level 4 Désolé pour les aficionados d'autres compilateurs, il faudra peut-être quelques adaptations. Mais si vous êtes étudiant, sachez que Visual Studio est offert. (moi, je fais de la pub? nooon...) Testé avec mIRC et telnet comme clients, irc.worldnet.net comme serveur.
Source
- /*
- RelaisIRC - Relais entre un client IRC et un serveur IRC pour obtenir un log.
- Port du relais : 6667
-
- Dernière modification le 11/07/2009 19h30
- */
-
-
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif
-
- #include <windows.h>
- #include <winsock2.h>
- #include <ws2tcpip.h>
- #include <stdio.h>
- #pragma comment(lib, "ws2_32.lib")
-
- #define T_FROM_SERVER 0 // Message reçu de la partie serveur
- #define T_FROM_CLIENT 1 // Message reçu de la partie cliente
- #define T_CLIENT_END 2 // Fin de connexion de la partie cliente
- #define T_SERVER_END 3 // Fin de la connexion de la partie serveur
-
- typedef struct __MESSAGE {
- int Type; // T_***, cf. plus haut
- char *Contenu; // Contenu du message, terminée par '\0'
- int TailleMessage; // Taille du message sans le '\0' final, pour T_FROM_SERVER et T_FROM_CLIENT
- struct __MESSAGE *Suivant;
- } MESSAGE;
-
- SOCKET ClientSocket, ServerSocket;
- CRITICAL_SECTION AccesPile;
- MESSAGE *Pile; // Pile de messages
- HANDLE EtatPile; // Event, permet l'attente de la thread de travail quand la pile est vide
- BOOL EtatThreadClient, EtatThreadServeur;
-
- DWORD WINAPI ThreadClient (LPVOID lpParameter);
- DWORD WINAPI ThreadServeur (LPVOID lpParameter);
-
- int main(int argc, char **argv)
- {
- WSADATA wsaData;
- int iResult;
- struct addrinfo *result, hints;
- SOCKET ListenSocket;
- MESSAGE *MessageTmp;
-
- // Attend deux paramètres : l'adresse du serveur et le numéro du port.
- if (argc != 3) {
- printf ("Erreur - Nombre de parametres incorrect.\n");
- printf ("Exemple de syntaxe correcte :`\"Relais irc.worldnet.net 6667\"\n");
- printf ("\n");
- return -1;
- }
-
- iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
- if (iResult != 0) {
- printf("WSAStartup failed: %d\n", iResult);
- return -1;
- }
-
- // Crée d'abord la partie serveur
- ZeroMemory(&hints, sizeof(hints));
- hints.ai_family = AF_INET;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- hints.ai_flags = AI_PASSIVE;
- iResult = getaddrinfo(NULL, "6667", &hints, &result);
- if (iResult != 0) {
- printf("getaddrinfo failed: %d\n", iResult);
- WSACleanup();
- return -1;
- }
- ListenSocket = socket (result->ai_family, result->ai_socktype, result->ai_protocol);
- if (ListenSocket == INVALID_SOCKET) {
- printf("Error at socket(): %ld\n", WSAGetLastError());
- freeaddrinfo(result);
- WSACleanup();
- return -1;
- }
- iResult = bind (ListenSocket, result->ai_addr, (int)result->ai_addrlen);
- if (iResult == SOCKET_ERROR) {
- printf("bind failed: %d\n", WSAGetLastError());
- freeaddrinfo(result);
- closesocket(ListenSocket);
- WSACleanup();
- return -1;
- }
- freeaddrinfo(result);
-
- printf ("*** Pret a recevoir un client ***\n");
-
- // Attend le client
- if (listen (ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
- printf( "Error at listen(): %ld\n", WSAGetLastError() );
- closesocket(ListenSocket);
- WSACleanup();
- return -1;
- }
- ClientSocket = accept (ListenSocket, NULL, NULL);
- if (ClientSocket == INVALID_SOCKET) {
- printf("accept failed: %d\n", WSAGetLastError());
- closesocket(ListenSocket);
- WSACleanup();
- return 1;
- }
- closesocket(ListenSocket); // N'accepte qu'un seul client
-
- printf ("*** Communication debutee avec le client ***\n");
-
- // Crée la partie cliente
- ZeroMemory(&hints, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- iResult = getaddrinfo (argv[1], argv[2], &hints, &result);
- if (iResult != 0) {
- printf("getaddrinfo failed: %d (2)\n", iResult);
- closesocket(ClientSocket);
- WSACleanup();
- return -1;
- }
- ServerSocket = socket (result->ai_family, result->ai_socktype, result->ai_protocol);
- if (ServerSocket == INVALID_SOCKET) {
- printf("Error at socket(): %ld (2)\n", WSAGetLastError());
- freeaddrinfo(result);
- closesocket(ClientSocket);
- WSACleanup();
- return -1;
- }
- iResult = connect(ServerSocket, result->ai_addr, (int)result->ai_addrlen);
- if (iResult == SOCKET_ERROR) {
- printf("connect failed: %d\n", iResult);
- closesocket(ServerSocket);
- freeaddrinfo(result);
- closesocket(ClientSocket);
- WSACleanup();
- return -1;
- }
- freeaddrinfo(result);
- if (ServerSocket == INVALID_SOCKET) {
- printf("Unable to connect to server!\n");
- closesocket(ServerSocket);
- closesocket(ClientSocket);
- WSACleanup();
- return -1;
- }
-
- printf ("*** Communication debutee avec le serveur ***\n");
-
- // Crée les objets de synchronisation
- Pile = NULL;
- InitializeCriticalSection (&AccesPile);
- EtatPile = CreateEvent (NULL, TRUE, FALSE, "EtatPile");
- EtatThreadClient = TRUE;
- EtatThreadServeur = TRUE;
-
- // Crée le thread client
- CreateThread (NULL, 0, ThreadClient, NULL, 0, NULL);
-
- // Crée la thread serveur
- CreateThread (NULL, 0, ThreadServeur, NULL, 0, NULL);
-
- for (;;) {
- WaitForSingleObject (EtatPile, INFINITE);
-
- EnterCriticalSection (&AccesPile);
-
- switch (Pile->Type) {
- case T_FROM_SERVER:
- printf ("Message du serveur : %s", Pile->Contenu);
- send (ClientSocket, Pile->Contenu, Pile->TailleMessage, 0);
- break;
-
- case T_FROM_CLIENT:
- printf ("Message du client : %s", Pile->Contenu);
- send (ServerSocket, Pile->Contenu, Pile->TailleMessage, 0);
- break;
-
- case T_SERVER_END:
- case T_CLIENT_END:
- printf ("%s", Pile->Contenu);
-
- // Met fin aux connexions
- closesocket(ServerSocket);
- closesocket(ClientSocket);
-
- break;
-
- }
-
- MessageTmp = Pile->Suivant;
- LocalFree (Pile->Contenu);
- LocalFree (Pile);
- Pile = MessageTmp;
-
- if (Pile == NULL) {
- if (EtatThreadServeur== FALSE && EtatThreadClient==FALSE) {
- LeaveCriticalSection (&AccesPile);
- DeleteCriticalSection (&AccesPile);
- WSACleanup();
- printf ("Fin des communications.");
- return 0;
- }
- ResetEvent (EtatPile);
- }
-
- LeaveCriticalSection (&AccesPile);
- }
- }
-
-
- DWORD WINAPI ThreadClient (LPVOID lpParameter)
- {
- char Buffer[512];
- char Message[513];
- int TailleMessage, DebutMessage;
- int NbrRecvd;
- int i;
- MESSAGE **MessageDPtr;
-
- UNREFERENCED_PARAMETER (lpParameter);
-
- TailleMessage = 0;
- for (;;) {
- switch (NbrRecvd = recv (ServerSocket, Buffer+TailleMessage, sizeof(Buffer)-TailleMessage, 0)) {
- case 0:
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
- strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Arret de la connexion cote serveur ***\n");
- (*MessageDPtr)->TailleMessage = 256;
- (*MessageDPtr)->Type = T_SERVER_END;
- SetEvent (EtatPile);
- EtatThreadClient = FALSE;
- LeaveCriticalSection (&AccesPile);
- return 0;
-
- case SOCKET_ERROR:
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
- strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur - Fin de la connexion cote serveur ***\n");
- (*MessageDPtr)->TailleMessage = 256;
- (*MessageDPtr)->Type = T_SERVER_END;
- SetEvent (EtatPile);
- EtatThreadClient = FALSE;
- LeaveCriticalSection (&AccesPile);
- return (DWORD)-1;
-
- default:
- // Découpe le buffer en messages
- DebutMessage = 0;
- NbrRecvd = TailleMessage+NbrRecvd;
- for (i=TailleMessage; i<NbrRecvd; i++) {
- Message[i-DebutMessage] = Buffer[i];
- TailleMessage ++;
- if (Buffer[i]=='\n') {
- Message[TailleMessage] = '\0';
-
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, TailleMessage+1);
- strcpy_s ((*MessageDPtr)->Contenu, TailleMessage+1, Message);
- (*MessageDPtr)->TailleMessage = TailleMessage;
- (*MessageDPtr)->Type = T_FROM_SERVER;
- SetEvent (EtatPile);
- LeaveCriticalSection (&AccesPile);
-
- DebutMessage += TailleMessage;
- TailleMessage = 0;
- }
- if (TailleMessage>=512) {
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
- strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur: Message trop long - Fin de la connexion cote serveur ***\n");
- (*MessageDPtr)->TailleMessage = 256;
- (*MessageDPtr)->Type = T_SERVER_END;
- SetEvent (EtatPile);
- EtatThreadClient = FALSE;
- LeaveCriticalSection (&AccesPile);
- return (DWORD)-1;
- }
- }
- }
- }
- }
-
-
- DWORD WINAPI ThreadServeur (LPVOID lpParameter)
- {
- char Buffer[512];
- char Message[513];
- int TailleMessage, DebutMessage;
- int NbrRecvd;
- int i;
- MESSAGE **MessageDPtr;
-
- UNREFERENCED_PARAMETER (lpParameter);
-
- TailleMessage = 0;
- for (;;) {
- switch (NbrRecvd = recv (ClientSocket, Buffer+TailleMessage, sizeof(Buffer)-1, 0)) {
- case 0:
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
- strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Arret de la connexion cote client ***\n");
- (*MessageDPtr)->TailleMessage = 256;
- (*MessageDPtr)->Type = T_CLIENT_END;
- (EtatPile);
- EtatThreadServeur = FALSE;
- LeaveCriticalSection (&AccesPile);
- return 0;
-
- case SOCKET_ERROR:
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
- strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur - Fin de la connexion cote client ***\n");
- (*MessageDPtr)->TailleMessage = 256;
- (*MessageDPtr)->Type = T_CLIENT_END;
- SetEvent (EtatPile);
- EtatThreadServeur= FALSE;
- LeaveCriticalSection (&AccesPile);
- return (DWORD)-1;
-
- default:
- // Découpe le buffer en messages
- DebutMessage = 0;
- NbrRecvd = TailleMessage+NbrRecvd;
- for (i=TailleMessage; i<NbrRecvd; i++) {
- Message[i-DebutMessage] = Buffer[i];
- TailleMessage ++;
- if (Buffer[i]=='\n') {
- Message[TailleMessage] = '\0';
-
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, TailleMessage+1);
- strcpy_s ((*MessageDPtr)->Contenu, TailleMessage+1, Message);
- (*MessageDPtr)->TailleMessage = TailleMessage;
- (*MessageDPtr)->Type = T_FROM_CLIENT;
- SetEvent (EtatPile);
- LeaveCriticalSection (&AccesPile);
-
- DebutMessage += TailleMessage;
- TailleMessage = 0;
- }
- if (TailleMessage>=512) {
- EnterCriticalSection (&AccesPile);
- for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
- *MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
- (*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
- strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur: Message trop long - Fin de la connexion cote serveur ***\n");
- (*MessageDPtr)->TailleMessage = 256;
- (*MessageDPtr)->Type = T_CLIENT_END;
- SetEvent (EtatPile);
- EtatThreadServeur = FALSE;
- LeaveCriticalSection (&AccesPile);
- return (DWORD)-1;
- }
- }
- }
- }
- }
/*
RelaisIRC - Relais entre un client IRC et un serveur IRC pour obtenir un log.
Port du relais : 6667
Dernière modification le 11/07/2009 19h30
*/
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#define T_FROM_SERVER 0 // Message reçu de la partie serveur
#define T_FROM_CLIENT 1 // Message reçu de la partie cliente
#define T_CLIENT_END 2 // Fin de connexion de la partie cliente
#define T_SERVER_END 3 // Fin de la connexion de la partie serveur
typedef struct __MESSAGE {
int Type; // T_***, cf. plus haut
char *Contenu; // Contenu du message, terminée par '\0'
int TailleMessage; // Taille du message sans le '\0' final, pour T_FROM_SERVER et T_FROM_CLIENT
struct __MESSAGE *Suivant;
} MESSAGE;
SOCKET ClientSocket, ServerSocket;
CRITICAL_SECTION AccesPile;
MESSAGE *Pile; // Pile de messages
HANDLE EtatPile; // Event, permet l'attente de la thread de travail quand la pile est vide
BOOL EtatThreadClient, EtatThreadServeur;
DWORD WINAPI ThreadClient (LPVOID lpParameter);
DWORD WINAPI ThreadServeur (LPVOID lpParameter);
int main(int argc, char **argv)
{
WSADATA wsaData;
int iResult;
struct addrinfo *result, hints;
SOCKET ListenSocket;
MESSAGE *MessageTmp;
// Attend deux paramètres : l'adresse du serveur et le numéro du port.
if (argc != 3) {
printf ("Erreur - Nombre de parametres incorrect.\n");
printf ("Exemple de syntaxe correcte :`\"Relais irc.worldnet.net 6667\"\n");
printf ("\n");
return -1;
}
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return -1;
}
// Crée d'abord la partie serveur
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
iResult = getaddrinfo(NULL, "6667", &hints, &result);
if (iResult != 0) {
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
return -1;
}
ListenSocket = socket (result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return -1;
}
iResult = bind (ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("bind failed: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return -1;
}
freeaddrinfo(result);
printf ("*** Pret a recevoir un client ***\n");
// Attend le client
if (listen (ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
printf( "Error at listen(): %ld\n", WSAGetLastError() );
closesocket(ListenSocket);
WSACleanup();
return -1;
}
ClientSocket = accept (ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
closesocket(ListenSocket); // N'accepte qu'un seul client
printf ("*** Communication debutee avec le client ***\n");
// Crée la partie cliente
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo (argv[1], argv[2], &hints, &result);
if (iResult != 0) {
printf("getaddrinfo failed: %d (2)\n", iResult);
closesocket(ClientSocket);
WSACleanup();
return -1;
}
ServerSocket = socket (result->ai_family, result->ai_socktype, result->ai_protocol);
if (ServerSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld (2)\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ClientSocket);
WSACleanup();
return -1;
}
iResult = connect(ServerSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("connect failed: %d\n", iResult);
closesocket(ServerSocket);
freeaddrinfo(result);
closesocket(ClientSocket);
WSACleanup();
return -1;
}
freeaddrinfo(result);
if (ServerSocket == INVALID_SOCKET) {
printf("Unable to connect to server!\n");
closesocket(ServerSocket);
closesocket(ClientSocket);
WSACleanup();
return -1;
}
printf ("*** Communication debutee avec le serveur ***\n");
// Crée les objets de synchronisation
Pile = NULL;
InitializeCriticalSection (&AccesPile);
EtatPile = CreateEvent (NULL, TRUE, FALSE, "EtatPile");
EtatThreadClient = TRUE;
EtatThreadServeur = TRUE;
// Crée le thread client
CreateThread (NULL, 0, ThreadClient, NULL, 0, NULL);
// Crée la thread serveur
CreateThread (NULL, 0, ThreadServeur, NULL, 0, NULL);
for (;;) {
WaitForSingleObject (EtatPile, INFINITE);
EnterCriticalSection (&AccesPile);
switch (Pile->Type) {
case T_FROM_SERVER:
printf ("Message du serveur : %s", Pile->Contenu);
send (ClientSocket, Pile->Contenu, Pile->TailleMessage, 0);
break;
case T_FROM_CLIENT:
printf ("Message du client : %s", Pile->Contenu);
send (ServerSocket, Pile->Contenu, Pile->TailleMessage, 0);
break;
case T_SERVER_END:
case T_CLIENT_END:
printf ("%s", Pile->Contenu);
// Met fin aux connexions
closesocket(ServerSocket);
closesocket(ClientSocket);
break;
}
MessageTmp = Pile->Suivant;
LocalFree (Pile->Contenu);
LocalFree (Pile);
Pile = MessageTmp;
if (Pile == NULL) {
if (EtatThreadServeur== FALSE && EtatThreadClient==FALSE) {
LeaveCriticalSection (&AccesPile);
DeleteCriticalSection (&AccesPile);
WSACleanup();
printf ("Fin des communications.");
return 0;
}
ResetEvent (EtatPile);
}
LeaveCriticalSection (&AccesPile);
}
}
DWORD WINAPI ThreadClient (LPVOID lpParameter)
{
char Buffer[512];
char Message[513];
int TailleMessage, DebutMessage;
int NbrRecvd;
int i;
MESSAGE **MessageDPtr;
UNREFERENCED_PARAMETER (lpParameter);
TailleMessage = 0;
for (;;) {
switch (NbrRecvd = recv (ServerSocket, Buffer+TailleMessage, sizeof(Buffer)-TailleMessage, 0)) {
case 0:
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Arret de la connexion cote serveur ***\n");
(*MessageDPtr)->TailleMessage = 256;
(*MessageDPtr)->Type = T_SERVER_END;
SetEvent (EtatPile);
EtatThreadClient = FALSE;
LeaveCriticalSection (&AccesPile);
return 0;
case SOCKET_ERROR:
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur - Fin de la connexion cote serveur ***\n");
(*MessageDPtr)->TailleMessage = 256;
(*MessageDPtr)->Type = T_SERVER_END;
SetEvent (EtatPile);
EtatThreadClient = FALSE;
LeaveCriticalSection (&AccesPile);
return (DWORD)-1;
default:
// Découpe le buffer en messages
DebutMessage = 0;
NbrRecvd = TailleMessage+NbrRecvd;
for (i=TailleMessage; i<NbrRecvd; i++) {
Message[i-DebutMessage] = Buffer[i];
TailleMessage ++;
if (Buffer[i]=='\n') {
Message[TailleMessage] = '\0';
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, TailleMessage+1);
strcpy_s ((*MessageDPtr)->Contenu, TailleMessage+1, Message);
(*MessageDPtr)->TailleMessage = TailleMessage;
(*MessageDPtr)->Type = T_FROM_SERVER;
SetEvent (EtatPile);
LeaveCriticalSection (&AccesPile);
DebutMessage += TailleMessage;
TailleMessage = 0;
}
if (TailleMessage>=512) {
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur: Message trop long - Fin de la connexion cote serveur ***\n");
(*MessageDPtr)->TailleMessage = 256;
(*MessageDPtr)->Type = T_SERVER_END;
SetEvent (EtatPile);
EtatThreadClient = FALSE;
LeaveCriticalSection (&AccesPile);
return (DWORD)-1;
}
}
}
}
}
DWORD WINAPI ThreadServeur (LPVOID lpParameter)
{
char Buffer[512];
char Message[513];
int TailleMessage, DebutMessage;
int NbrRecvd;
int i;
MESSAGE **MessageDPtr;
UNREFERENCED_PARAMETER (lpParameter);
TailleMessage = 0;
for (;;) {
switch (NbrRecvd = recv (ClientSocket, Buffer+TailleMessage, sizeof(Buffer)-1, 0)) {
case 0:
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Arret de la connexion cote client ***\n");
(*MessageDPtr)->TailleMessage = 256;
(*MessageDPtr)->Type = T_CLIENT_END;
(EtatPile);
EtatThreadServeur = FALSE;
LeaveCriticalSection (&AccesPile);
return 0;
case SOCKET_ERROR:
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur - Fin de la connexion cote client ***\n");
(*MessageDPtr)->TailleMessage = 256;
(*MessageDPtr)->Type = T_CLIENT_END;
SetEvent (EtatPile);
EtatThreadServeur= FALSE;
LeaveCriticalSection (&AccesPile);
return (DWORD)-1;
default:
// Découpe le buffer en messages
DebutMessage = 0;
NbrRecvd = TailleMessage+NbrRecvd;
for (i=TailleMessage; i<NbrRecvd; i++) {
Message[i-DebutMessage] = Buffer[i];
TailleMessage ++;
if (Buffer[i]=='\n') {
Message[TailleMessage] = '\0';
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, TailleMessage+1);
strcpy_s ((*MessageDPtr)->Contenu, TailleMessage+1, Message);
(*MessageDPtr)->TailleMessage = TailleMessage;
(*MessageDPtr)->Type = T_FROM_CLIENT;
SetEvent (EtatPile);
LeaveCriticalSection (&AccesPile);
DebutMessage += TailleMessage;
TailleMessage = 0;
}
if (TailleMessage>=512) {
EnterCriticalSection (&AccesPile);
for (MessageDPtr=&Pile; *MessageDPtr!=NULL; MessageDPtr=&(*MessageDPtr)->Suivant) {}
*MessageDPtr = LocalAlloc (LMEM_ZEROINIT, sizeof(MESSAGE));
(*MessageDPtr)->Contenu = LocalAlloc (LMEM_ZEROINIT, 256);
strcpy_s ((*MessageDPtr)->Contenu, 256, "*** Erreur: Message trop long - Fin de la connexion cote serveur ***\n");
(*MessageDPtr)->TailleMessage = 256;
(*MessageDPtr)->Type = T_CLIENT_END;
SetEvent (EtatPile);
EtatThreadServeur = FALSE;
LeaveCriticalSection (&AccesPile);
return (DWORD)-1;
}
}
}
}
}
Conclusion
N'hésitez pas à donner vos avis et à reporter des problèmes.
Historique
- 27 juillet 2009 19:23:42 :
- Précisions sur le compilateur utilisé.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
DEMANDE AIDE: aide sur socket, server proxy et spoof [ par retaks666 ]
je voudrai savoir si en etudaint les sockets, je pourrai creer un serveur proxy ki renvoie une fausse ip, par exemple cela pourrai servir de spoofer s
C++ Builder: Client irc (a laide!) [ par Psyc0s ]
Bon je suis en train de faire un client irc avec C++ builder Mais le socket ne veux pas envoyer les message au serveur:(La connexion au serveur foncti
Pb connexion HTTP avec socket. [ par LuckyNut ]
Bonjour,J'ai fait un prog permettant de lire des pages html à partir des sockets. Tout marche chez moi mais le programme ne marche pas chez un pote qu
quel est le prob avec send(); en socket C [ par shadow1779 ]
Bonjour,j'ai un petit probleme, je developpe un petit bot irc en C via les socket, j'ai fai le debut ou le programme demande a l'utilisateur quel est
Connexion a irc.voila.fr [ par Globox60 ]
Bonjour a tous,Je prog sous builder, et je cherche a me faire un client irc avec. Le pb est la clé d' acces de orange.J utilise ce code :ClientSocket1
Socket / IRC : Couleurs [ par DakM ]
Bonjourrr, cest une question sur les socket, plus precisement un robot irc, comment envoyer le caractere de controle pour les couleur, si on C/C dans
Client Server -> le faire fonctioner comme un trojan [ par wxccxw ]
Salut, enfaite, j'aimerai faire un client -> serveur, je maitrise pas mal les socket, mais je n'ai pas compris a quoi sa sert : recv(); c pour rec
Socket en attente de message [ par wiool ]
Il y a un moyen de faire en sorte qu'une socket tcp en c++ attende seulement un certain temps une reponse ? En fait, je voudrais que si au bout de 15
PB compilation de socket [ par dhylde ]
Bonjour a tous, j'ai un petit souci de compilation (j'ai du manqué l'inclusion d'une Librairy). Bref je me prend la tete depuis ce matin. Je suis
Socket [ par edpunisher ]
kikoo, j ai un projet oû je doit utiliser les socket entre une machine windows et une autre unix sauf que j ai tt asseyer mais rien ne marche, le
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|