Problème avec ma socket C++
Bonjour à tous,
alors voila, je créé deux socket, une qui attend et lit, l'autre qui se connecte à la première et qui lui envoi le message.
Tous marche bien, ma socket se connecte à la première puis lui envoi le message que j'ai instancié à "coucou", la deuxième socket écoute et affiche la chaine de caractère envoyée.
Mon problème est que lorsque je quitte mon application qui écoute, la console plante, avec un jolie pop-up "Le programme à cessé de fonction" et je trouve cela franchement gênant mais si mon objectif principale qui était d'envoyer une chaine de caractère d'un PC à un autre est rempli.
Je ne sais pas pourquoi, je ne vois aucun problème dans mon code, le voici :
SOURCE écoute :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#if defined (WIN32) // Verifie si l'OS est Windows ou un autre.
#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 <string.h>
#define PORT 23
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;
SOCKET csock;
SOCKADDR_IN csin;
char chaine[32] = "Bonjour !";
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));
/* Si l'on reçoit des informations : on les affiche à l'écran */
if(recv(csock, chaine, 300, 0) != SOCKET_ERROR)
printf("Recu : %s\n", chaine);
/* 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(csock);
closesocket(sock);
printf("Fermeture du serveur terminee\n");
}
WSACleanup();
}
/* On attend que l'utilisateur tape sur une touche, puis on ferme */
system("PAUSE");
return 0;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#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>
#define PORT 23
int main(void)
{
#if defined (WIN32)
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
int sock_err=0;
#else
int erreur = 0;
#endif
SOCKET sock;
SOCKADDR_IN sin;
char chaine[32] = "coucou";
/* 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));
sock_err = send(sock, chaine, 300, 0);
/* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */
shutdown(sock, 2);
}
/* sinon, on affiche "Impossible de se connecter" */
else
{
printf("Impossible de se connecter\n");
}
/* On ferme la socket */
closesocket(sock);
WSACleanup();
}
/* On attend que l'utilisateur tape sur une touche, puis on ferme */
system("PAUSE");
return EXIT_SUCCESS;
} |
En attendant votre aide,
Cordialement,
GibsonSG_76