Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1176 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C] Pb de socket sous Windows

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Pb de socket sous Windows

n°139867
Tomate
Posté le 16-05-2002 à 14:49:33  profilanswer
 

j essaye de creer une socket avec la lib winsock2, mais la fonction WSAGetLastError me renvoie tjs le meme code 10093 (???)
 
je sais po ce aue c est comme erreur, et je vois pas pk ca marche pas surtout....
 
 
donc s il y a des pros du C sous windows, qu ils me donnent la ligne pour juste creer une socket, merci

mood
Publicité
Posté le 16-05-2002 à 14:49:33  profilanswer
 

n°139878
Tomate
Posté le 16-05-2002 à 14:55:26  profilanswer
 

personne n a utilise les sockets ou quoi????

n°139893
Tomate
Posté le 16-05-2002 à 15:09:43  profilanswer
 

up

n°139905
Tomate
Posté le 16-05-2002 à 15:22:09  profilanswer
 

qlq un peut au moins lire mon post siouplait:D

n°139929
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-05-2002 à 15:59:39  profilanswer
 

Cette erreur vient du fait que tu n'as pas appelé la fonction WSAStartup avant de créer ton socket. Cette fonction est nécessaire pour initialiser la librairie winsock.
 
Voir ici pour des infos sur cette fonction
 
http://msdn.microsoft.com/library/ [...] f_1v8y.asp

 

[jfdsdjhfuetppo]--Message édité par Harkonnen le 16-05-2002 à 16:05:22--[/jfdsdjhfuetppo]


---------------
J'ai un string dans l'array (Paris Hilton)
n°139970
Tomate
Posté le 16-05-2002 à 17:12:17  profilanswer
 

je penses que je peux dire que tu es mon sauveur, encore merci mille fois!!:D

n°139972
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-05-2002 à 17:13:46  profilanswer
 

:hello:


---------------
J'ai un string dans l'array (Paris Hilton)
n°139992
slvn
Posté le 16-05-2002 à 17:39:21  profilanswer
 

Je post ici, car il s'agit aussi des sockets :
 
j ai une application (un petit jeu en reseau), qui utilise les des socket tcp / blockant.
 
sous unix / windows ca marche impec  (me suis debrouillé pour faire qq chose de portable)
 
 
mais sous solaris : pas moyen de creer une socket !
(AF_INET, SOCK_STREAM, IPPORTO_TCP) :(((((
(ca compile, j ai include les libs socket et nsl (sais meme pas ce que c!) )
 
en gros, sous solaris, j ai les lib, mais j arrive pas a faire marche le :  "socket( , , )"

n°140080
Tomate
Posté le 16-05-2002 à 20:25:53  profilanswer
 

bon la socket est bien cree, mais j ai un autre pb now : c est avec connect
 
le prog (client)arrive jusqu a la ligne ou y a connect, puis 30 sec plus tard, il pete une erreur(10060)
 
le serveur qui ecoute fonctionne, car je l ai lance pendant 10 min, et aucune erreur (je fais un select sur les connexions arrivantes, et j ai bien l  entree standard qui se rajoute ds la file), mais il ne voit evidemment pas la demande de connexion du client!!
 
 
alors je me demandai si, comme pour socket, il fo pas d abord appeller une fonction de windows pour que le connect marche??????????????
 
a vous de me dire, car sur msdn, j ai po trouve, snif!

n°140083
veryfree
Posté le 16-05-2002 à 20:34:13  profilanswer
 

ca comence a etre le bordel la  :D

mood
Publicité
Posté le 16-05-2002 à 20:34:13  profilanswer
 

n°140100
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-05-2002 à 20:51:30  profilanswer
 

erreur 10060 = connection timeout
 
le serveur n'a pas répondu à la demande de ton client. te branches tu sur le bon port ? utilises tu un firewall ?
 
essaie de poster ton code si tu peux


---------------
J'ai un string dans l'array (Paris Hilton)
n°140205
Tomate
Posté le 17-05-2002 à 08:42:15  profilanswer
 

bah si c est timeout c est chelou
j essaie bien evidemment sur le bon port (!!), mais j ai un firewall
c est sur la meme machine que se trouvent client et serveur

n°140281
Tomate
Posté le 17-05-2002 à 10:59:50  profilanswer
 

up!!

n°140294
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-05-2002 à 11:09:02  profilanswer
 

ben oui mais bon, je vois pas quoi te dire de plus...
 
rééssaie en désactivant ton firewall, ou sur une autre machine ou alors poste ton source, peut etre qu'on y verra plus clair


---------------
J'ai un string dans l'array (Paris Hilton)
n°140485
Tomate
Posté le 17-05-2002 à 15:32:51  profilanswer
 

voici le code du serveur :
 
#include <stdio.h>
#include <stdlib.h>
#include "ircd.h"
#include <unistd.h>
 
 
int main(int ac, char **av)
{
  struct sockaddr_in sock;
  int   fd_sock;
  int  size;
  int  err;
 
  printf("%s%s\n", BONUS, BONUX);
  WORD wVersionRequested;
  WSADATA wsaData;
  int err_ini;
 
  wVersionRequested = MAKEWORD( 2, 2 );
 
  err_ini = WSAStartup( wVersionRequested, &wsaData );
  if (err_ini != 0)
   {
     /* Tell the user that we could not find a usable */
     /* WinSock DLL.                                  */
  printf("Aucune librairie Winsock trouvee.\n" );
     return (-1);
  }
 
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater    */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we      */
/* requested.                                        */
 
if (LOBYTE(wsaData.wVersion) != 2 ||
        HIBYTE(wsaData.wVersion) != 2)
 {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
    WSACleanup( );
    printf("Aucune librairie Winsock trouvee.\n" );
    return (-1);
 }
  if ((fd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
  err = WSAGetLastError();
  printf("error : %d, %d\n", err, fd_sock);
 }
  sock.sin_family = AF_INET;
  sock.sin_port = htons(atoi(av[1]));
  sock.sin_addr.s_addr = INADDR_ANY;
  size = sizeof (struct sockaddr_in);
  if (bind(fd_sock, (struct sockaddr*) &sock, size) == -1)
    {
  err = WSAGetLastError();
  printf("error bind : %d, %d\n", err, fd_sock);
 }
  if (listen(fd_sock, 5) == -1)
    {
  err = WSAGetLastError();
  printf("error listen: %d, %d\n", err, fd_sock);
 }
  loop(fd_sock, size);
  return (0);
}
 
void   loop(int fd_sock, int size)
{
  fd_set                fd_read;
  int                   max;
  t_client              *list;
  t_client              *tmp;
  struct sockaddr_in    client;
 
  max = fd_sock + 1;
  list = init(&fd_read, fd_sock);
  while (1)
    {
      clean_struct(list, &fd_read, max);
      tmp = list;
      while (tmp)
        {
          if (tmp->fd != fd_sock)
     treat_msg(&list, tmp, &fd_read);
   else
     if (FD_ISSET(fd_sock, &fd_read))
       max = add_client(fd_sock, max, &client, &list);
 tmp = tmp->next;
        }
    }
}
 
void clean_struct(t_client *list, fd_set *fd_read, int max)
{
  t_client  *tmp;
  struct timeval        time;
 
  time.tv_sec = 0;
  time.tv_usec = 0;
  FD_ZERO(fd_read);
  tmp = list;
  while (tmp)
    {
      FD_SET(tmp->fd, fd_read);
      tmp = tmp->next;
    }
  select(max, fd_read, 0, 0, &time);
}
 
t_client *init(fd_set *fd_read, int fd_sock)
{
  t_client *list;
 
  list = 0;
  FD_ZERO(fd_read);
  FD_SET(fd_sock, fd_read);
  my_put_in_list(&list, fd_sock);
  return (list);
}
 
 
 
 
 
et voici celui du client :
 
 
#include <stdlib.h>
#include "client.h"
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <winsock2.h>
 
void check(fd_set *fd_read, int fd_sock, char *buf);
 
int   main(int ac, char **av)
{
  struct sockaddr_in sock;
 
  int   fd_sock;
  int  size;
  struct hostent *host;
  fd_set                fd_read;
  char   buf[1024];
  int  err;
  WORD wVersionRequested;
  WSADATA wsaData;
  int err_ini;
 
  size = sizeof (struct sockaddr_in);
  wVersionRequested = MAKEWORD( 2, 2 );
 
  err_ini = WSAStartup( wVersionRequested, &wsaData );
  if (err_ini != 0)
   {
     /* Tell the user that we could not find a usable */
     /* WinSock DLL.                                  */
  printf("Aucune librairie Winsock trouvee.\n" );
     return (-1);
  }
 
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater    */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we      */
/* requested.                                        */
 
if (LOBYTE(wsaData.wVersion) != 2 ||
        HIBYTE(wsaData.wVersion) != 2)
 {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
    WSACleanup( );
    printf("Aucune librairie Winsock trouvee.\n" );
    return (-1);
 }
 
  if ((fd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
  err = WSAGetLastError();
  printf("error socket: %d, %d\n", err, fd_sock);
 exit(-1);
 }
  if (!(host = gethostbyname(av[1])))
 {
  err = WSAGetLastError();
  printf("error gethostbyname: %d, %d\n", err, fd_sock);
 exit(-1);
 }
 
  sock.sin_family = AF_INET;
  sock.sin_port = htons(atoi("13357" ));//atoi(av[2]));
  memcpy(host->h_addr, &(sock.sin_addr.s_addr), host->h_length);
  printf("prout\n" );
  if (-1 == connect(fd_sock, &sock, size))
    {
  err = WSAGetLastError();
  printf("error connect: %d\n", err);
  exit(-1);
 }
  printf("prout\n" );
  MY_WRITE(1, PROMPT);
  while (1)
    {
      FD_ZERO(&fd_read);
      FD_SET(0, &fd_read);
      FD_SET(fd_sock, &fd_read);
      if (-1 == select(fd_sock + 1, &fd_read, 0, 0, 0))
  {
   err = WSAGetLastError();
   printf("error select: %d\n", err);
  exit(-1);
 }
      else
 check(&fd_read, fd_sock, buf);
    }
  return (0);
}
 
int loop(int fd_sock)
{
  char buf[1024];
  int lu;
 
  lu = read(0, buf, 1024);
  if (lu > 1)
    write(fd_sock, buf, lu);
  else
    MY_WRITE(1, PROMPT);
  return (0);
}
 
 
void check(fd_set *fd_read, int fd_sock, char *buf)
{
  if (FD_ISSET(0, fd_read))
    loop(fd_sock);
  if (FD_ISSET(fd_sock, fd_read))
    {
      memset(buf, 0, 1024);
      if (0 > read(fd_sock, buf, 1024))
 {
   printf("%s\n", ENDCON);
   exit(0);
 }
      MY_WRITE(1, buf);
    }
}
 
 
voilou, je vois po ou ca peut merder
 
ps : tout ca marche tres bien sous BSD....

n°141116
Tomate
Posté le 19-05-2002 à 22:05:34  profilanswer
 

bon je vois que mon code ne vous a pas plu!!:D
 
bon, j ai trouve des infos, nautement sur le fait que socket sous windows renvoie une var de type SOCKET, alors que sous unix c est un int (descripteur de la socket)
 
le pb, c est que ce int j en ai besoin pour select!!!!
et je sais po ou le trouver!!!
 
 
 
 
 
 
voila, donc je suis tjs ds l impace, merci de m aider!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C] Pb de socket sous Windows

 

Sujets relatifs
Latex et Windows[C] pb de code sous windows
quel logiciel pour coder sous windows??[Apache 2.0.36 + Windows 2000 Server] Problème avec les .htaccess
[ Unix Java ] socket - transfert limité à 256 octets ?!!![Delphi] Client/Serveur : gérer l'évenement "on error" du socket.
J2ME ou PersonalJava ou... pour Windows CE ?affichage d'un buffer sous windows ???
Interseption message windows-> Quels outils pour charger des librairies sous Linux ET Windows ? <-
Plus de sujets relatifs à : [C] Pb de socket sous Windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR