Hello!
Je te mets mon code (c'est un patchwork de sources trouvées ici, j'avoue avoir pas trop pigé).
D'abord les fonctions:
#include <winsock2.h> // Socket
#pragma comment(lib,"WS2_32.lib") // Librairie Associé au Socket
#define WM_SOCKET WM_USER+100
int ClientConnect(char *IP,int PORT);
SOCKET m_socket;
SOCKET AcceptSocket;
sockaddr_in clientService;
//BOOL csGet();
//BOOL csSend();
// ###############################################################
// ***********
// *********** Connection du client
// ***********
// ###############################################################
BOOL ClientConnect(char *IP,int PORT)
{
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
{
WSACleanup(); return FALSE;
}
//Create a socket.
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if (m_socket == INVALID_SOCKET)
{
WSACleanup(); return FALSE;
}
// Connect to a server.
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(IP);
clientService.sin_port = htons(PORT);
if (connect(m_socket,(SOCKADDR*) &clientService,sizeof(clientService)) == SOCKET_ERROR)
{
WSACleanup();
return FALSE;
}
else
{
return TRUE;
}
//Initialisation de WSAAsyncSelect
if(WSAAsyncSelect(m_socket, NULL, WM_SOCKET, FD_READ|FD_WRITE|FD_CONNECT) == SOCKET_ERROR)
{
WSACleanup(); return FALSE;
}
return TRUE;
}
// ###############################################################
// ***********
// *********** Envoi d'un char
// ***********
// ###############################################################
BOOL csSend(char* szData, DWORD msgSize)
{
send(m_socket,szData,msgSize,0);
return TRUE;
}
// ###############################################################
// ***********
// *********** Envoi d'un fichier
// ***********
// ###############################################################
BOOL csSendFile(char* fileName)
{
FILE* fich;
char *buffer;
int TailleFichier1;
DWORD dwFileSize=0;
HANDLE hSrcFile = INVALID_HANDLE_VALUE;
hSrcFile = CreateFile(fileName,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hSrcFile == INVALID_HANDLE_VALUE)
{
CloseHandle(hSrcFile);
return FALSE;
}
dwFileSize = GetFileSize(hSrcFile,NULL) + 1;
CloseHandle(hSrcFile);
if ((buffer=(char *)malloc(dwFileSize))==NULL) return FALSE;
if ((fich=fopen(fileName,"rb"))==NULL) return FALSE;
TailleFichier1=fread(buffer,1,10000,fich);
if (send(m_socket,buffer,TailleFichier1,0)<0) return FALSE;
fclose(fich);
free(buffer);
return TRUE;
}
// ###############################################################
// ***********
// *********** Réception d'un buffer
// ***********
// ###############################################################
BOOL csGet(char* getData)
{
ZeroMemory(getData,10000);
recv(m_socket,getData,10000,0);
return true;
}
// ###############################################################
// ***********
// *********** Réception d'un fichier
// ***********
// ###############################################################
BOOL csGetFile(char* fileName)
{
FILE* fich;
char *buffer; // buffer memoire, va recevoir données du serveur
int TailleFichier; // Taille Fichier
if ((fich=fopen(fileName,"w"))==NULL) {return FALSE;}
if ((buffer=(char *)malloc(10000))==NULL) {return FALSE;}
if ((TailleFichier=recv(m_socket,buffer,10000,0))<0) {return FALSE;}
fwrite(buffer,1,TailleFichier,fich); // Ecriture dans FICHIER
fclose(fich);
free(buffer); // Libère mémoire
return TRUE;
}
// ###############################################################
// ***********
// *********** Attente d'un client
// ***********
// ###############################################################
BOOL ServerListen(int PORT)
{
//Initialisation de WINSOCK
WSADATA wsaData;
//int optval = 0x200;
int iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
if(iResult != NO_ERROR)
{
WSACleanup();
return FALSE;
}
//Creation du socket
m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_socket == INVALID_SOCKET)
{
WSACleanup();
return FALSE;
}
//Binding du socket
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.S_un.S_addr = INADDR_ANY;
service.sin_port = htons(PORT);
iResult = bind(m_socket,(SOCKADDR*) &service, sizeof(service));
if(iResult == SOCKET_ERROR)
{
closesocket(m_socket);
return FALSE;
}
//Ecoute sur le socket
if (listen(m_socket,0) == SOCKET_ERROR) // J'ai remplacé le 0 par un 1
// setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&optval, sizeof(optval));
// setsockopt(m_socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&optval, sizeof(optval));
if(WSAAsyncSelect(m_socket, NULL, WM_SOCKET, FD_ACCEPT|FD_CLOSE|FD_READ|FD_WRITE) == SOCKET_ERROR)
{
WSACleanup();
return FALSE;
}
return TRUE;
}
Dans mon prog, je n'ai qu'un seul client, du coup il me semble qu'il ne vient se connecter qu'une fois (ClientConnect(..))
Ensuite, dans mon programme principale, je fais des appels genre:
if (!csSendFile("file.txt")) {return FALSE;}
et le "return false" me fait sortir de la où je suis et m'envoie à
...
case IDC_COMP:
if(computeS(hWndconf)){
MessageBox(hWndconf,"GHIProof successfully executed","Verifier: Success",MB_OK);
}
else{
MessageBox(hWndconf,"GHIProof aborted: an error occurs","Verifier: Error",MB_OK);
}
closesocket(m_socket);
return TRUE;
En fait, que ce soit True ou False, lorsque j'en ai fini avec mon client (computeS), mon socket est fermé!
Tu penses quoi de mon code (faut encore que je tienne compte de la remarque de aardman) ???