Problèmes avec les Socket

baptchr55 Messages postés 34 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 6 avril 2011 - 25 janv. 2011 à 16:16
donkeeland Messages postés 1 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 27 janvier 2011 - 27 janv. 2011 à 04:22
Bonjour à tous,

Je suis ennuyé avec la création de socket.

J'aimerais pouvoir envoyer des données (dans un premier temps que j'écris) une par une seule problème mon code ne lis que la première donnée reçu et se ferme (Site du zéro).

Si quelqu'un peut m'éclaircir un peu ??

Merci d'avance.

***** Client *****

#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
#include
#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>

#define PORT 1664



int main(void)
{
#if defined (WIN32)
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
#else
int erreur = 0;
#endif

SOCKET sock;
SOCKADDR_IN sin;
char buffer[32] = "";

/* Si les sockets Windows fonctionnent */
if(!erreur)
{
/* Création de la socket */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* Configuration de la connexion */
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);

/* Si l'on a réussi à se connecter */
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
printf("Connection à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));

/* Si l'on reçoit des informations : on les affiche à l'écran */
if(recv(sock, buffer, 32, 0) != SOCKET_ERROR)
printf("Recu : %s\n", buffer);
char buffer[32] = "";
}
/* sinon, on affiche "Impossible de se connecter" */
/*else
{
printf("Impossible de se connecter\n");
}*/

/* On ferme la socket */
closesocket(sock);


}

/* On attend que l'utilisateur tape sur une touche, puis on ferme */
getchar();

return EXIT_SUCCESS;
}



*********** Serveur ***********




#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
#include
#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 <string.h>

#define PORT 1664



int main(void)
{

int erreur = 0;


SOCKET sock;
SOCKADDR_IN sin;
SOCKET csock;
SOCKADDR_IN csin;
char buffer[32] = "Bienvenue sur le serveur UPA";
socklen_t recsize = sizeof(csin);
int sock_err;

/* Si les sockets Windows fonctionnent */
if(!erreur)
{
sock = socket(AF_INET, SOCK_STREAM, 0);

/* Si la socket est valide */
if(sock != INVALID_SOCKET)
{
printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);

/* Configuration */
sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */
sin.sin_family = AF_INET; /* Protocole familial (IP) */
sin.sin_port = htons(PORT); /* Listage du port */
sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin));

/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Démarrage du listage (mode server) */
sock_err = listen(sock, 5);
printf("Listage du port %d...\n", PORT);

/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Attente pendant laquelle le client se connecte */
printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);

csock = accept(sock, (SOCKADDR*)&csin, &recsize);
printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));


sock_err = send(csock, buffer, 32, 0);

if(sock_err != SOCKET_ERROR)
printf("Chaine envoyée : %s\n", buffer);


else
printf("Erreur de transmission\n");

printf("entrez la chaine à envoyer :\n");



/* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */
shutdown(csock, 2);
}
}

/* Fermeture de la socket */
printf("Fermeture de la socket...\n");
closesocket(sock);
printf("Fermeture du serveur terminee\n");
}

#if defined (WIN32)
WSACleanup();
#endif
}

/* On attend que l'utilisateur tape sur une touche, puis on ferme */
getchar();

return EXIT_SUCCESS;
}

1 réponse

donkeeland Messages postés 1 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 27 janvier 2011
27 janv. 2011 à 04:22
Deja, indente ton source et utilise les balises pour le cpp [code =cpp]/code

Ton code n'est pas fait pour lire/envoyer plus d'une seule donnee.
Si tu veux en lire plusieurs il faut faire des boucles au niveaux de la lexture/ecriture
0
Rejoignez-nous