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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
| #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 <string.h>
#define PORT 1025
/*--------------------------------------------------*/
/* Structure pour lire l'en-tête du fichier bmp */
/*--------------------------------------------------*/
struct entete_struct {
char signature[2];
int taille;
int offset;
int taille_entete;
int largeur;
int longueur;
int plans;
int bpp;
int compression;
int taille_image;
int Hresolution;
int Vresolution;
int nbr_couleur;
int nbr_couleur_importante;
}entete;
/*---------------------------------------------*/
/* Converison de l'en-tête de l'hexa en deci */
/*---------------------------------------------*/
int hex2dec (unsigned char hex[4],int nombre)
{
int resultat = 0;
int i;
for (i = nombre - 1; i >= 0; i--)
resultat = resultat * 256 + hex[i];
return resultat;
}
/*--------------------------------------------*/
/* Lecture de l'en-tête */
/*--------------------------------------------*/
void lire_fichier ()
{
unsigned char temp[4];
FILE * fichier;
fichier = fopen("/home/elric/Images/ImageTraitement.bmp", "r");
if (fichier == NULL)
{
printf("impossible d'ouvrir le fichier\n");
exit(0);
}
fread (&entete.signature,2,1,fichier);
fread (&temp,4,1,fichier);
entete.taille = hex2dec (temp,4);
fread (&temp,4,1,fichier);
fread (&temp,4,1,fichier);
entete.offset = hex2dec (temp,4);
fread (&temp,4,1,fichier);
entete.taille_entete = hex2dec (temp,4);
fread (&temp,4,1,fichier);
entete.largeur = hex2dec(temp,4);
fread (&temp,4,1,fichier);
entete.longueur = hex2dec(temp,4);
fread (&temp,2,1,fichier);
entete.plans = hex2dec (temp,2);
fread (&temp,2,1,fichier);
entete.bpp = hex2dec (temp,2);
fread (&temp,4,1,fichier);
entete.compression = hex2dec (temp,4);
fread (&temp,4,1,fichier);
entete.taille_image = hex2dec (temp,4);
fread (&temp,4,1,fichier);
entete.Hresolution = hex2dec (temp,4);
fread (&temp,4,1,fichier);
entete.Vresolution = hex2dec (temp,4);
fread (&temp,4,1,fichier);
entete.nbr_couleur = hex2dec (temp,4);
fread (&temp,4,1,fichier);
entete.nbr_couleur_importante = hex2dec (temp,4);
fclose (fichier);
}
/*---------------------------------------------*/
/* fichier main */
/*---------------------------------------------*/
int main(void)
{
lire_fichier ();//Lecture du header
printf ("Taille du fichier à envoyer : %d\n",entete.taille);
printf ("Largeur : %d\n",entete.largeur);
printf ("Longueur : %d\n",entete.longueur);
/* Je lis l'image et la stock dans mon tableau de char*/
FILE * fic_image;
fic_image = fopen("/home/elric/Images/ImageTraitement.bmp", "r");
if (fic_image == NULL){
printf("Error unable to open image\n");
exit(0);
}
unsigned char bitmapImage_envoi[entete.taille*sizeof(char)];
fread(bitmapImage_envoi,sizeof(char),entete.taille,fic_image);
fclose(fic_image);
/*-----*/
/* j'enregistre l'image pour voir si l'image envoye est correct*/
FILE * fic_image_E;
fic_image_E = fopen("/home/elric/Images/envoie/imageEnvoyee.bmp","wb");
if (fic_image_E == NULL){
printf("Error unable to write the image\n");
exit(0);
}
fwrite(bitmapImage_envoi,1024*sizeof(char),510*511,fic_image_E);
fclose(fic_image_E);
/*----*/
#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;
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));
/*ENVOI DE L'IMAGE*/
sock_err = send(csock, bitmapImage_envoi,510*511, 0);
if(sock_err != SOCKET_ERROR)
printf("Chaine envoyée");
else
printf("Erreur de transmission\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
}
return EXIT_SUCCESS;
} |
Partager