[b:e612dce47f]Bonjour à tous ![/b:e612dce47f]
[i:e612dce47f]Me voilà encore une fois car je me suis lancé dans les sockets... Mais bien que l'envie soit la, je suis rebuté encore une fois par de détails :[/i:e612dce47f]
[b:e612dce47f]1 -[/b:e612dce47f] La thread qui s'occupe d'envoyer ou recevoir ne reçois ni envois rien...
[b:e612dce47f]2 -[/b:e612dce47f] Si je met un recv/send après acceptation d'un nouveau client, cela fonctionne mais qu'une seule fois (alors que côté client, une boucle se charge d'envoyer tout le temps les infos)
[b:e612dce47f]3 -[/b:e612dce47f] Je n'ai pas encore compris comment envoyez et recevoir sur la même application... Une explication serais la bienvenue
Je sais que le code est dégueulasse et je m'en excuse... C'est un serveur/client de test dans le but de bien tout comprendre avant de me lancer dans un soft plus propre et plus générique... Mais pour ça il me faut bien comprendre tout son fonctionnement.
[i:e612dce47f]Un[/i:e612dce47f] [b:e612dce47f]GROS[/b:e612dce47f] [i:e612dce47f]merci à ceux qui pourrons répondre à mes questions !![/i:e612dce47f]
[code:1:e612dce47f]#define MAX_CLIENTS 10
#include <fstream>
using namespace std;
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"pthreadVC2.lib")
#include <pthread.h>
#if defined (WIN32)
#include <winsock2.h>
typedef int socklen_t;
#elif defined (linux)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close (s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#endif
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define PORT 55555
typedef struct ClientInfos
{
int ID;
char User[32];
char Password[32];
char Name[200];
int IsRegister;
int Packet;
int Alive;
int sayChat;
char Chat[512];
int nbrClients;
int UseRefID;
}ClientInfos;
ClientInfos ClientInfo[30];
typedef struct Client
{
SOCKET ClientSocket;
};
Client Client[MAX_CLIENTS];
SOCKET csock;
SOCKET sock;
int client=0;
pthread_t ThreadRecvAndSend;
void *Sync_Client(void *data);
int main(void)
{
#if defined (WIN32)
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
#else
int erreur = 0;
#endif
SOCKADDR_IN sin;
int recsize = sizeof sin;
int sock_err;
if(!erreur)
{
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock != INVALID_SOCKET)
{
printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sock_err = bind(sock, (SOCKADDR*) &sin, recsize);
if(sock_err != SOCKET_ERROR)
{
sock_err = listen(sock, 5);
printf("Listage du port %d...\n", PORT);
if(sock_err != SOCKET_ERROR)
{
fd_set readfs;
while(1)
{
FD_ZERO(&readfs);
FD_SET(sock, &readfs);
if(select(sock + 1, &readfs, NULL, NULL, NULL) < 0)
{
perror("select()");
exit(errno);
}
if(FD_ISSET(sock, &readfs))
{
SOCKADDR_IN csin;
int crecsize = sizeof csin;
SOCKET csock = accept(sock, (SOCKADDR *) &csin, &crecsize);
printf("Un client s'est connecte\n");
pthread_create(&ThreadRecvAndSend, NULL, Sync_Client, NULL);
client++;
}
}
}
}
}
}
#if defined (WIN32)
WSACleanup();
#endif
return EXIT_SUCCESS;
}
void *Sync_Client(void *data)
{
bool Connected = 1;
while(Connected)
{
if(recv(csock, reinterpret_cast<char*>(&ClientInfo), sizeof(ClientInfo), 0) != SOCKET_ERROR)
{
printf("%s test\n", ClientInfo[1].User);
}
else if (send(csock, reinterpret_cast<char*>(&ClientInfo), sizeof(ClientInfo), 0) != SOCKET_ERROR)
{
printf("%s test\n", ClientInfo[1].User);
}
else Connected = false;
}
}[/code:1:e612dce47f]