Accueil > Forum > > > > Problème de Socket(recv)
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
|
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
|
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
|
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|