[C] Pb de socket sous Windows

Pb de socket sous Windows [C] - C++ - Programmation

Marsh Posté le 16-05-2002 à 14:49:33    

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

Reply

Marsh Posté le 16-05-2002 à 14:49:33   

Reply

Marsh Posté le 16-05-2002 à 14:55:26    

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

Reply

Marsh Posté le 16-05-2002 à 15:09:43    

up

Reply

Marsh Posté le 16-05-2002 à 15:22:09    

qlq un peut au moins lire mon post siouplait:D

Reply

Marsh Posté le 16-05-2002 à 15:59:39    

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)
Reply

Marsh Posté le 16-05-2002 à 17:12:17    

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

Reply

Marsh Posté le 16-05-2002 à 17:13:46    

:hello:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-05-2002 à 17:39:21    

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( , , )"

Reply

Marsh Posté le 16-05-2002 à 20:25:53    

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!

Reply

Marsh Posté le 16-05-2002 à 20:34:13    

ca comence a etre le bordel la  :D

Reply

Marsh Posté le 16-05-2002 à 20:34:13   

Reply

Marsh Posté le 16-05-2002 à 20:51:30    

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)
Reply

Marsh Posté le 17-05-2002 à 08:42:15    

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

Reply

Marsh Posté le 17-05-2002 à 10:59:50    

up!!

Reply

Marsh Posté le 17-05-2002 à 11:09:02    

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)
Reply

Marsh Posté le 17-05-2002 à 15:32:51    

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....

Reply

Marsh Posté le 19-05-2002 à 22:05:34    

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!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed