begin process at 2012 05 29 22:10:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Problème de Socket(recv)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de Socket(recv)

lundi 6 septembre 2004 à 20:06:12 | Problème de Socket(recv)

YnOThAr

Voila je suis en train d'essayer de faire un client FTp mais j'ai vraiment du mal...mon preblème c ke j'arrive pas à réceptionner les réponses du serveur donc je c po ou j'en suis du tout...je vous post les grande ligne du programme....

Je vous passe les Includes...la compilation est bonne...


char *ipaddr;
int port;
char *buffer;


int main(int argc, char *argv[])
{
if (argc != 3)
{
printf("\nUtilisation : .exe [Host] [port]\n");
getchar();
return 0;
}

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;
SOCKADDR_IN sin;

sin.sin_addr.s_addr = inet_addr(ipaddr);
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sock = socket(AF_INET,SOCK_STREAM,0);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));

connect(sock, (SOCKADDR *)&sin, sizeof(sin));
printf("\nConnection au FTP");

/* Sending USER */
send(sock, "USER Anonymous\r\n",16,0);

recv(sock, buffer, sizeof(buffer), 0);

printf("\nBuffer : %s",buffer);
printf("\nSizeOfBuffer : %d",sizeof(buffer));
getchar();

closesocket(sock);
WSACleanup();
getchar();
return 0;
}


Et donc le programme m'affiche que buffer fait une taille de 4 et qu'il a pour valeur "<NULL>"
Bien sur l'adresse du ftp que g mise est bonne vu ke je l'ai testé avec un logiciel FTP...c vraiment bizare...donc si vous avez des conseils, des idées...Je prends tout !!! Meme les critiques de code du moment que ca me fasse progresser....Par pitier j'aimerais comprendre

Thx d'avance et encore bravo pour votre site....il est vraiment kool
lundi 6 septembre 2004 à 20:18:39 | Re : Problème de Socket(recv)

Nebula

Membre Club
char *buffer;

Tu dois associer de la mémoire à ton buffer...

exemple : char* buffer = malloc(100*sizeof(char));
ou char buffer[100];

Et indiquer 100 au lieu de sizeof(buffer) dans recv(). Renseigne toi sur les pointeurs et les allocations mémoire, tu en auras besoin ;-)
lundi 6 septembre 2004 à 21:06:13 | Re : Problème de Socket(recv)

YnOThAr

Ba en fait o début j'avais mi un buffer[4096] mais bon j'avais changé parce ke y'avé des tutos ou il utilisaient un pointeur...Sinon imaginons que je mettes buffer[256] et que le server m'envoie ( enfin si un jour j'arrive a recevoir ce que le server me renvoie... ) et que la réponse fait plus de 256 ca ferait koi ?? Sinon si j'utilise sizeof ca fait quoi en plus ou moins ??
lundi 6 septembre 2004 à 21:25:12 | Re : Problème de Socket(recv)

Nebula

Membre Club
C'est à toi de gérer ce genre de cas... En général, on traite les données du buffer, puis on déplace les données non traitées au début du buffer, avant de lire la suite des données en le copiant à la suite du buffer (c'est dans ce cas qu'un pointeur est utile).

sizeof retourne la taille de la variable, pas de son contenu. En général (entiers, structures) c'est la même, mais pas pour les pointeurs, qui sont codés sur 32 bits soit 4 octets, et qui peuvent pointer sur n'importe quoi...
lundi 6 septembre 2004 à 21:30:42 | Re : Problème de Socket(recv)

AlexMAN

Membre Club
pour recupérer la taille des données ki peuvent etre recus, il faut utiliser getsockopt(), si jme souviens bien, ca fait 8ko.

mardi 7 septembre 2004 à 04:31:16 | Re : Problème de Socket(recv)

NitRic


ioctlsocket() peut être utilisé aussi ...

int ret = 0;
unsigned long nbBytes = 0L;

if ( ! !ioctlsocket( sck, FIONREAD, &nbBytes ) ) {
puts("ioctlsocket() error: %d\n", WSAGetLastError());
return 0;
}

if ( nbBytes > 0L ) {

printf( "%lu octets presents\n", nbBytes );

/* 0(déconnecté), -1(erreur), >0(données recus) */
if ( (ret = recv( sck, buffer, nbBytes, 0 )) > 0 ) {

buffer[ret] = '\0';
printf("recu: %s\n", buffer);

}
else puts("recv() error: %d\n", WSAGetLastError());

}
else puts("pas de donnees\n");

Oui, par `Défaut` c'est 8ko/call à recv()

La taille d'un pointeur est variable. Identique au int, selon le système; 16, 32, 64, ... bits.

Comment fais-tu pour savoir que c'est ton recv() qui ne fonctionne pas ? Tu ne sais même pas si tu est réellement connecté au serveur FTP et si ta demande de connexion à été acceptée.


La validation, l'une des choses les plus imoprtante en programmation.


~(.:: NitRic ::.)~
mardi 7 septembre 2004 à 22:37:28 | Re : Problème de Socket(recv)

YnOThAr

Kool merci les gars, et surtout NitRic...J'essaye tout ca des que g du temps et je vous tiens o courant...thx encore
jeudi 9 septembre 2004 à 07:12:12 | Re : Problème de Socket(recv)

YnOThAr

C Bon je viens de tout reprendre à zéro et ca marche...enfin ca se connecte et je recv la réponse du serveur...C deja ca me direz vous ^^ Sinon j'ai une autre petite question, je développe sous borland et j'aimerais remettre à zéro avant chaque recv mon buffer, pour ca aparement y'a bzero() qui appartient à strings.h ( bien avec le s ) mais kan je mets mon include, lors de la compilation impossible de linker la fonction bzero....quel autre moyen j'ai pour mettre à zéro mon buffer ?Thx a lot
jeudi 9 septembre 2004 à 10:35:09 | Re : Problème de Socket(recv)

NitRic


#include <string.h>

memset( buffer, 0, buffer_size );
strnset( buffer, 0, buffer_size );
...
...
...

Sinon, à la mano:

void __cdecl fill_buffer( char * buf, int c, size_t sz ) {
char * b = buf;
if ( sz && buf ) {
while ( sz-- ) *b++ = c;
}
}

fill_buffer( buffer, 0, buffer_size );

Prend la meilleur méthode et utilise la ! Perso je préfère le memset() aux autres ...



~(.:: NitRic ::.)~
mardi 9 février 2010 à 12:07:41 | Re : Problème de Socket(recv)

valantino1







nice
Bonjour tr le monde ,

en faite je suis entrain de programmer une ptite application multithread qui envoie des sockets à des @ IP(10 @ en simultané) et selon le retour de select de socket il decode l'entete(IpHeader) et revoi le resultat ; si on teste la select avec un seul poste en simultané il marche trés biens alors que lorsque je tente de le testé avec plus que de 2 en simultanés la select retourne toujours 1 = sig que la select contient des donnees alors ce n est pas le cas ! (car ces adresses IP ne sont pas connectés ) !
voila un extrait de code :

// Initialisation du nombre de ping à faire = nombre de retrait
if(iNBPing == 0)
iNBPing = NBPINGDEFAULT;//si le nombre de retarit est a 0 on prend le nombre par default 1.

// Initialisation du délai d'attente
if(iTpsLimite == 0)
iTpsLimite = DEFALUTTIMEOUT;//si le delai d'attente est 0 on prend le timeout par defaut 1000 MS

while((CHote->iNbRetryUsed != iNBPing)&&(!bRstConn))
{
memset(szICMP_data,0,DATASIZE_ICMP);
iID = (unsigned short)GetCurrentProcessId() + CHote->iNbRetryUsed;
// Construction du paquet ICMP
IcmpHeader *icmp_hdr;
icmp_hdr = (IcmpHeader*)szICMP_data;
icmp_hdr->type = TYPE_ICMP_ECHO; // Type du paquet ICMP : echo request
icmp_hdr->code = CODE_ICMP_NULL; // Il n'y a pas de code spécifique pour ce type de paquet
icmp_hdr->id = iID;//identificateur de paquet
icmp_hdr->sequence = SEQU_ICMP_ECHO;
icmp_hdr->timestamp = GetTickCount(); // Initialisation du temps lors de l'envoi

// Somme de contrôle sur 16 bits
((IcmpHeader*)szICMP_data)->checksum = checksum((unsigned short*)szICMP_data, DATASIZE_ICMP);

// On envoie le paquet ICMP que l'on a construit
iEnvoi = sendto(sock, szICMP_data, DATASIZE_ICMP, 0, (struct sockaddr *)&sin, DATASIZE_ICMP);
FD_ZERO(&fdsr);
FD_SET(sock, &fdsr);

tv_timeout.tv_sec = iTpsLimite/1000;
tv_timeout.tv_usec = 0;


iFindelai = 0;

do{
if (select(sock+1, &fdsr, NULL, NULL, &tv_timeout) <= 0)
{
// Dans le cas où le temps est écoulé, on veut sortir de la boucle
// on compte le paquet comme envoyé mais perdu
// delai d'attente de la demande depassée
CHote->iNbRetryUsed = CHote->iNbRetryUsed+1;
iPerte= iPerte+1;
iFindelai = 1;

}

//Cette fonction vérifie si le descripteur "sock" est contenu dans l'ensemble "fdsr" après l'appel à select.
if (FD_ISSET(sock, &fdsr))
{
// Dans le cas où le buffer du socket contient des données,
// on les décode
iRecept=recvfrom(sock, szRecvbuf, MAX_PACKET, 0, (struct sockaddr *)&from, &iFromlen);

/***********************************************************/
iphdr = (IpHeader *)szRecvbuf;
iphdrlen = iphdr->h_len * 4 ;
icmphdr = (IcmpHeader*)(szRecvbuf + iphdrlen);

if(iID!=(icmphdr->id))
{
// Cas où le paquet n'est pas à nous
iFindelai= 0;
}
else
{
CHote->iNbRetryUsed = CHote->iNbRetryUsed +1;
iFindelai= 1;
}

/***************************************************/

memset(szRecvbuf,0,MAX_PACKET);
//dés la prmiere ping : si on a l'envoi est supérieur de perte on sort
if((CHote->iNbRetryUsed-iPerte)>0)
bRstConn=true;

}
}
while(iFindelai == 0);


Cette discussion est classée dans : buffer, ftp, socket, sin, sock


Répondre à ce message

Sujets en rapport avec ce message

link avec GCC [ par mrjulien ] Bonjours a tous.Je compile avec gcc sous windows (grâce a mingw). Je ne souhaite pas vous ennuyer en créant un topic redondant, mais je n'arrive pas à Socket Server/Client [ par XKaliBur ] Je suis débutant et je voudrais faire en sorte d'envoyer un message au mon serveur et des que ce dernier reçoit un message, il réponde en fonction de Socket en C [ par RM50Man ] WSADATA ws;                    WSAStartup(MAKEWORD(2,0), &ws);              &n [socket et api win]recevoir et envoyer en meme temps [ par shadow1779 ] Bonjour je me suis fais un petit programme irc qui me servira de bot pour auto-op des personne ou d'autre taches diverses, le client aura une boite de Probléme pour lire le buffer au lancement de la connexion [ par logant83 ] Bonsoir, voila enfaite j'ai établi une connexion sur un server irc grace au socket mais quand je recois sur le buffer les différente informations (Ell Probleme entre DLL et socket [ par XKaliBur ] Le probleme est que je réalise un hook sur mon clavier et que chaque frappe interceptée je veux l'envoyer via un socket à un serveur, mais des que j'e probleme boucles mutliple avec les sockets [ par miki42 ] Bonjour a tous voila j'ai pa le choix,deja une semaine que je mord la langue pour trouver dou vient mon probleme mais rien y fait suit obliger de fari Socket en c avec winsock2.h [ par juju11288 ] Bonjour a tous je voudrai pour le moment arriver a faire un client serveur en c qui parle entre eux avec le protocole TCP/IP. Je fait les deux  progra Connexion SOCKET_ERROR [ par fredsor ] Salut a tous,Je réalise un ptit programme au sein duquel je me connecte a un serveur distant, afin de récupérer via une methode GET des informations n


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales