NewbieContest

Programmation => Langages compilés => Discussion démarrée par: Invit le 01 Août 2007 à 16:19:21



Titre: [C] problème de socket
Posté par: Invit le 01 Août 2007 à 16:19:21
Voici les erreurs...

(http://wmv.ifrance.com/socket.gif)

Que faire ?


Titre: [C] problème de socket
Posté par: frok le 01 Août 2007 à 16:55:11
tiens je sais pas si ça peut t'aider
Code:
#include <stdio.h>
#include <winsock.h>
#include <string.h>

#ifndef SD_SEND
#define SD_SEND 1
#endif

bool init_winsock(void) {
   WSAData Data;
   int Code;

   if((Code=WSAStartup(MAKEWORD(1, 1),&Data)) != 0) {
      printf("erreur dans WSAStartup() : %d\n", Code);
      return false;
   }
   return true;
}

SOCKET etablir_connexion(u_long adresse_distante, u_short port) {
   sockaddr_in sinDistant;
   SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);

   if(sd!=INVALID_SOCKET) {
       sinDistant.sin_family = AF_INET;
       sinDistant.sin_addr.s_addr = adresse_distante;
       sinDistant.sin_port = port;
       if(connect(sd,
         (sockaddr*)&sinDistant,
         sizeof(sockaddr_in))==SOCKET_ERROR)
             sd = INVALID_SOCKET;
  }
  return sd;
}

u_long resoudre_adresse(char* hote) {
   hostent* pHE;
   u_long adresse_distante = inet_addr(hote);

   if(adresse_distante == INADDR_NONE) {
      pHE = gethostbyname(hote);
      if(pHE == 0) return INADDR_NONE;
      adresse_distante = *((u_long*)pHE->h_addr_list[0]);
   }
   return adresse_distante;
}

int main(void) {
char *Hote = "newbiecontest.free.fr";
int Port = 80;
    int req;
   
init_winsock();

u_long adresse;
SOCKET sd;
char *requete;
char tampon;

// Trouver l'adresse de l'hôte
printf("Recherche de l'hôte... [%s]\n", Hote);
adresse = resoudre_adresse(Hote);
if(adresse==INADDR_NONE) {
  printf("Echec !\n");
  return 3;
}

printf("Connexion en cours !\n");
sd = etablir_connexion(adresse, htons(Port));
if(sd!=INVALID_SOCKET) printf("Connecté !\n");

// envoi de la requête
requete="GET /ep15/index.php HTTP/1.1\r\nHost: newbiecontest.free.fr\r\nAccept: */*\r\n\r\n";
req=send(sd, requete, strlen(requete)+1,0);

// réception de la réponse
while(recv(sd,&tampon,1,0)!=0) {
         printf("%c", tampon);
}
// quitter correctement winsock
shutdown(sd, SD_SEND);
closesocket(sd);
WSACleanup();

   
    system("PAUSE");
}


Titre: [C] problème de socket
Posté par: Invit le 01 Août 2007 à 17:42:42
Non, je ne veux pas envoyer de requêtes http
je veus crée un client et un serveur le problème
c'est qu'il y a des erreurs avec Code::Block...
:/

code copier du site

[http://www.iprezo.org/index.php?page=sockc]

Code:
Code Client (TCP - socket bloquante)

#include <stdio.h>    // printf
#include <conio.h>    // getch()
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;
SOCKADDR_IN sin;
char buffer[255];

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family    = AF_INET;
sin.sin_port    = htons(4444);

connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    memset(buffer,0,255);
recv(sock, buffer, sizeof(buffer), 0);
    printf("%s",buffer);
    getch();
closesocket(sock);
WSACleanup();
}

Code Serveur (TCP - socket bloquante)

#include <stdio.h>    // printf
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

void main()
{
char buffer[255];

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

SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family    = AF_INET;
sin.sin_port    = htons(4444);

bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);

while(1)
{
  int sinsize = sizeof(csin);
  if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
  {
      memset(buffer,0,255);
        wsprintf(buffer,"Bienvenu sur mon serveur ;)");
        send(csock,buffer,255,0);
  }
}
}


Titre: [C] problème de socket
Posté par: Folcan le 02 Août 2007 à 08:46:55
En C, il faut laisser une ligne vide à la fin de ton code.

Apparement ton erreur viens de la.


Titre: [C] problème de socket
Posté par: _o_ le 02 Août 2007 à 09:18:19
Citation de: Folcan
En C, il faut laisser une ligne vide à la fin de ton code.
Pas que je sache, non. Ca doit être une spécificité de son compilateur. en tout cas, gcc n'en a pas besoin.

Edit: curieux, puisque Code::Blocks utilise gcc par défaut.


Titre: [C] problème de socket
Posté par: phoenix1204 le 02 Août 2007 à 13:52:45
Et pourtant si, c'est une des guidelines des standards ANSI/ISO C (http://gcc.gnu.org/ml/gcc/2003-11/msg01568.html) :
Citation
A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character.
J'avais lu en son temps une autre explication qui disait que toute ligne de code doit se terminer par un retour de chariot... Quoi qu'il en soit c'est un warning, i.e. cela n'empêche en aucun cas la compilation et n'a aucune répercussion sur l'exécution. La vérité est ailleurs :shock:


Titre: [C] problème de socket
Posté par: _o_ le 02 Août 2007 à 14:34:23
Citation de: phoenix1204
Et pourtant si, c'est une des guidelines des standards ANSI/ISO C
Rhooooo ! gcc ne suit pas les standards ? :)
Avec -ansi et -pedantic, il ne râle toujours pas (oui, j'ai -Wall également). Je dois louper quelque chose.


Titre: [C] problème de socket
Posté par: Invit le 02 Août 2007 à 15:31:04
Je serais plus pour la cause du compilateur parceque j'ai essayer aussi visual C++ 2005
mais lui aussi me renvoye des erreurs...

Que faire ? :cry:


Titre: [C] problème de socket
Posté par: lilxam le 02 Août 2007 à 18:15:30
Ce serait bien de voir ta 27eme ligne voire tout ton code. Sinon pour le "Syntax error at end of input" tu oublie peutetre de fermer une acolade. Et pour la ligne vide à la fin ce n'est pas forcément nécessaire, le code sera quand meme compilé.


Titre: [C] problème de socket
Posté par: phoenix1204 le 02 Août 2007 à 18:32:08
Citation de: _o_
Rhooooo ! gcc ne suit pas les standards ? :)
Avec -ansi et -pedantic, il ne râle toujours pas (oui, j'ai -Wall également). Je dois louper quelque chose.
Qui a dit que j'utilisais une distrib de lamerz :twisted: ?
Code:
[phoenix@home tmp]$ gcc -o test test.c
test.c:3:2: warning: no newline at end of file
[phoenix@home tmp]$ echo -e '\n' >> test.c
[phoenix@home tmp]$ gcc -o test test.c
[phoenix@home tmp]$


Titre: [C] problème de socket
Posté par: _o_ le 02 Août 2007 à 18:42:12
Citation de: phoenix1204
Qui a dit que j'utilisais une distrib de lamerz :twisted: ?
_o/ Et je le maintiens. :)

Bon, après vérification, c'est mon éditeur de texte qui ajoute systématiquement un retour-chariot mais qui ne l'affiche pas (vim pour ne pas le nommer). Je ne suis pas fou.


Titre: [C] problème de socket
Posté par: Invit le 03 Août 2007 à 15:33:48
Code:
Ce serait bien de voir ta 27eme ligne voire tout ton code
ben regarde ci-dessus il y a tout mon code source

([http://www.iprezo.org/index.php?page=sockc])

J'ai une nouvelle info sur mon problème après une compilation avec visual C++ 2005

Code:
1>c:\documents and settings\********\mes documents\visual studio 2005\projects\o\o\o.cpp(4) : fatal error C1083: Impossible d'ouvrir le fichier include : 'winsock2.h' : No such file or directory


Titre: [C] problème de socket
Posté par: Folcan le 03 Août 2007 à 19:23:11
Tout simplement qu'il ne trouve pas la librairie winsock2.h

A voir si elle est par default dans visual C++
Sinon, a downloader sur le net.


Titre: [C] problème de socket
Posté par: _o_ le 03 Août 2007 à 19:36:02
Citation de: Folcan
A voir si elle est par default dans visual C++
Sinon, a downloader sur le net.
La réponse est sur le site publiant ce code source. Au paragraphe «1ère étape».


Titre: [C] problème de socket
Posté par: Invit le 03 Août 2007 à 21:09:28
Non, je suis retourner sur Code::Block ensuite j'ai regarder les librairies winsock2.h étais dans la liste...


Titre: [C] problème de socket
Posté par: _o_ le 04 Août 2007 à 08:56:06
Citation de: ECHELON
pour vous montrer en détail les erreurs, j'ai fait 2 screenshot...
C'est vraiment pas pratique les captures d'écran. Tu devrais utiliser un site du genre pastebin (http://pastebin.com/), pour ça, c'est parfait. Tu y mets le code source, les erreurs de compilation, et chacun peut faire des modifications directement dans ton code.

Pour revenir à ton problème, le message d'erreur a changé. Chaque chose en son temps. Pour l'instant, c'est le prototype de la fonction main() qui ne plait pas au compilateur. Un prototype classique est plutôt :
Code:
int main(int argc, char **argv)
Évidemment, dans ce cas, il faut ajouter un return( <code> ) à la fin de la fonction, sinon le compilateur se remettra à râler.

Pour l'instant, tes problèmes ne sont absolument pas liés à la programmation par socket. C'est plutôt de la programmation C (gestion des headers et des librairies, compilation d'un programme de base, etc.). Je te conseille fortement de suivre des tutoriels d'un niveau plus léger, pour débuter. Le site du zéro reste toujours une référence à ce sujet.


Titre: [C] problème de socket
Posté par: Invit le 04 Août 2007 à 15:53:02
J'ai trouvé comment faire j'ai installer visual studio 6.0 est-il à installer les composants manquant, est maintenant ça marche très bien  :wink:
sinon pour le code source il était juste...
pour ton bout de code  _O_ j'avais déjà essayer de le mettre auparavant.
 
Sinon merci à tous pour aide que vous m'avez apporté. ;)


Titre: [C] problème de socket
Posté par: neoflo le 19 Septembre 2007 à 22:08:59
Pour information, les fichiers du genre winsock2.h sont des fichiers d'entête et non des bibliothèques (qui d'ailleurs ne s'appelle pas librairie en français). Par contre, on peut parler de la bibliothèque winsock2.