Problème de manipulation de pointeurs
dc.sara
Messages postés
3
Statut
Membre
-
tde -
tde -
Bonjour tlm,
voici exactement la description de mon problème mon problème:
1 - j'ai une variable buffer sur laquelle je me met ce que je recoit avec recv sur chaque socket
2 - tous les données qui arrive dans buffer doivent être stocker dans une variable gloable pointé par tab.
3 - pour ne pas alourdir le serveur, il faut que chaque fois ou je traite des éléments dans tab, je les enlève et je libère l'espace mémoire qui a été allouée pour ne pas arriver à un point où tab devient tres grand
1 j'ai reussit à le faire,
par contre 2 et 3, je ne sais pas comment les faire, svp, pouvez vous m'aidez et me dire comment faire ca ?? (je suis débutante en C)
merci ,
Sara
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define MAXPENDING 5 /* Max connection requests */
#define BUFFSIZE 32
void Die(char *mess) {perror(mess); exit(1);}
void HandleClient(int sock, char *tab) {
char buffer[BUFFSIZE];
int i, received = -1;
/* Receive message */
if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
Die("Failed to receive initial bytes from client");
}
/* Send bytes and check for more incoming data in loop */
while (received > 0) {
/* Send back received data */
if (send(sock, buffer, received, 0) != received) {
Die("Failed to send bytes to client");
}
/* Check for more data */
if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
Die("Failed to receive additional bytes from client");
}
for(i=0; i < 4; i++){
printf("%.2x\n",buffer[i]);
}
}
close(sock);
}
int main(int argc, char *argv[]){
int serversock, clientsock;
struct sockaddr_in echoserver, echoclient;
char *tab;
if (argc != 2) {
fprintf(stderr, "USAGE: echoserver <port>\n");
exit(1);
}
/* Create the TCP socket */
if ((serversock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
Die("Failed to create socket");
}
printf("Bonjour 1\n");
/* Construct the server sockaddr_in structure */
memset(&echoserver, 0, sizeof(echoserver)); /* Clear struct */
echoserver.sin_family = AF_INET; /* Internet/IP */
echoserver.sin_addr.s_addr = htonl(INADDR_ANY); /* Incoming addr */
echoserver.sin_port = htons(atoi(argv[1])); /* server port */
printf("Bonjour 2\n");
/* Bind the server socket */
if (bind(serversock, (struct sockaddr *) &echoserver, sizeof(echoserver)) < 0) {
Die("Failed to bind the server socket");
}
printf("Bonjour 3\n");
/* Listen on the server socket */
if (listen(serversock, MAXPENDING) < 0) {
Die("Failed to listen on server socket");
}
printf("Bonjour 4\n");
/* Run until cancelled */
while (1) {
unsigned int clientlen = sizeof(echoclient);
/* Wait for client connection */
if ((clientsock =
accept(serversock, (struct sockaddr *) &echoclient, &clientlen)) < 0) {
Die("Failed to accept client connection");
}
fprintf(stdout, "Client connected: %s\n", inet_ntoa(echoclient.sin_addr));
HandleClient(clientsock, tab);
}
}
voici exactement la description de mon problème mon problème:
1 - j'ai une variable buffer sur laquelle je me met ce que je recoit avec recv sur chaque socket
2 - tous les données qui arrive dans buffer doivent être stocker dans une variable gloable pointé par tab.
3 - pour ne pas alourdir le serveur, il faut que chaque fois ou je traite des éléments dans tab, je les enlève et je libère l'espace mémoire qui a été allouée pour ne pas arriver à un point où tab devient tres grand
1 j'ai reussit à le faire,
par contre 2 et 3, je ne sais pas comment les faire, svp, pouvez vous m'aidez et me dire comment faire ca ?? (je suis débutante en C)
merci ,
Sara
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define MAXPENDING 5 /* Max connection requests */
#define BUFFSIZE 32
void Die(char *mess) {perror(mess); exit(1);}
void HandleClient(int sock, char *tab) {
char buffer[BUFFSIZE];
int i, received = -1;
/* Receive message */
if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
Die("Failed to receive initial bytes from client");
}
/* Send bytes and check for more incoming data in loop */
while (received > 0) {
/* Send back received data */
if (send(sock, buffer, received, 0) != received) {
Die("Failed to send bytes to client");
}
/* Check for more data */
if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
Die("Failed to receive additional bytes from client");
}
for(i=0; i < 4; i++){
printf("%.2x\n",buffer[i]);
}
}
close(sock);
}
int main(int argc, char *argv[]){
int serversock, clientsock;
struct sockaddr_in echoserver, echoclient;
char *tab;
if (argc != 2) {
fprintf(stderr, "USAGE: echoserver <port>\n");
exit(1);
}
/* Create the TCP socket */
if ((serversock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
Die("Failed to create socket");
}
printf("Bonjour 1\n");
/* Construct the server sockaddr_in structure */
memset(&echoserver, 0, sizeof(echoserver)); /* Clear struct */
echoserver.sin_family = AF_INET; /* Internet/IP */
echoserver.sin_addr.s_addr = htonl(INADDR_ANY); /* Incoming addr */
echoserver.sin_port = htons(atoi(argv[1])); /* server port */
printf("Bonjour 2\n");
/* Bind the server socket */
if (bind(serversock, (struct sockaddr *) &echoserver, sizeof(echoserver)) < 0) {
Die("Failed to bind the server socket");
}
printf("Bonjour 3\n");
/* Listen on the server socket */
if (listen(serversock, MAXPENDING) < 0) {
Die("Failed to listen on server socket");
}
printf("Bonjour 4\n");
/* Run until cancelled */
while (1) {
unsigned int clientlen = sizeof(echoclient);
/* Wait for client connection */
if ((clientsock =
accept(serversock, (struct sockaddr *) &echoclient, &clientlen)) < 0) {
Die("Failed to accept client connection");
}
fprintf(stdout, "Client connected: %s\n", inet_ntoa(echoclient.sin_addr));
HandleClient(clientsock, tab);
}
}
A voir également:
- Problème de manipulation de pointeurs
- Lettre de motivation manipulateur radio ✓ - Forum Études / Formation High-Tech
- Le pointeur de mon pc portable ne marche plus - Guide
- Pointeur de souris - Guide
- Pointeurs satellites - Forum TNT / Satellite / Réception
- Agrandir le pointeur de la souris - Guide
1 réponse
Hello !
Tu dois déclarer ta variable tab comme un char** et non un char*.
Ensuite, si tu veux qu'elle soit globale, tu dois la déclarer hors de ton main(), car actuellement, elle est locale à main().
Pour tab, tu places simplement le buffer dans le premier emplacement libre.
Déclares aussi to buffer comme un char*.
Pour libérer, tu fais un free(tab[adresse_du_buffer])
Bon courage et bonne chance !
Tu dois déclarer ta variable tab comme un char** et non un char*.
Ensuite, si tu veux qu'elle soit globale, tu dois la déclarer hors de ton main(), car actuellement, elle est locale à main().
Pour tab, tu places simplement le buffer dans le premier emplacement libre.
Déclares aussi to buffer comme un char*.
Pour libérer, tu fais un free(tab[adresse_du_buffer])
Bon courage et bonne chance !