Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » seltsam: Sockets

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
11.01.2004, 10:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Ich habe ein (dachte mir) portables c++ programm geschrieben, welche eine eigene Socket-klasse enthält. Nur, unter Linux funktioniert die Receivefunktion nie.


C++:
int CSocket::Receive(char *cmd, int len)
{
  int readen = 0;
  fd_set rfds;
  struct timeval tv;
  int retval;

  memset(cmd,0,sizeof(cmd));
  FD_ZERO(&rfds);
  FD_SET(m_hSocket, &rfds);
  tv.tv_sec = 15;
  tv.tv_usec = 0;

  retval = select(1, &rfds, NULL, NULL, &tv);
  if (retval)
  {
#ifdef WIN32
    readen = recv(m_hSocket,cmd,len,0);
#else
    readen = read(m_hSocket,cmd,len);
#endif
  }
  cmd[readen] = '\0';
  return readen;
}



unter Linux ist readen immer 0, auch wenn eigentlich daten kommen müssten.

Ich versteh nicht warum immer der Timeout eintritt und er nix empfängt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.01.2004, 12:53 Uhr
kronos
Quotenfisch
(Operator)


du kannst (musst?) auch unter linux recv verwenden...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.01.2004, 13:22 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


daran liegt es nicht, ich habe nun mal die Funktion so geändert:


C++:
  // ...

  retval = select(1, &rfds, NULL, NULL, &tv);
  if(-1 == retval)
  {
    std::cerr << "Fehler: select fehlgeschlagen" << std::endl;
    return 0;
  }
  if(0 == retval)
  {
    std::cerr << "select returned 0: " << strerror(errno) << std::endl;
  }
  /*if(FD_ISSET(m_hSocket,&rfds))
  {*/

    readen = recv(m_hSocket,cmd,len,0);
  //}
  // ...



retval ist immer 0, errno ist "Success"

readen in diesem fall 300 irgendwas, also er liest, warum funktioniert der select aufruf nicht?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.01.2004, 13:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


man man man, das das in windows überhaupt geklappt hat muss zufall gewesen sein!


C++:
select(1 , ...



da muss natürlich


C++:
select(m_hSocket+1, ...)



hin!

Dann funktioniert es auch
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.01.2004, 13:31 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat:
FloSoft postete
man man man, das das in windows überhaupt geklappt hat muss zufall gewesen sein!

Zitat aus der MSDN:

Zitat:

int select (
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);

Parameters
nfds
[in] This parameter is ignored; it is included only for compatibility with Berkeley sockets.
...


Es scheint also (zumnindest unter Windows) egal zu sein was du als ersten Parameter übergibst. Aber was sind denn Berkley Sockets??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.01.2004, 14:03 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


bsd Sockets, also "Linux"

(Ich weiß das BSD nix mit Linux am Hut hat, außer das es nicht von Microsoft ist , BSD, Linux, gehört alles in die gleiche Spalte)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.01.2004, 14:34 Uhr
(un)wissender
Niveauwart


Mache auch gerad eine Socketklasse, allerdings nur für Win32. Sie wird threadsicher sein und extrem einfach zu benutzen.
Können dann mal vergleichen und evtl. zusammenlegen, um die tollste Win32/Linux Klasse zu implementieren.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.01.2004, 14:36 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das hier war nur für ein mini-programm, welches auch unter linux laufen soll und eben einfach nur was empfangen und senden können soll, aber eben nicht abstürzen soll wenn der andere nix sendet.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.01.2004, 17:07 Uhr
(un)wissender
Niveauwart


OK
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.01.2004, 17:19 Uhr
virtual
Sexiest Bit alive
(Operator)


@(un)wissender
Ich habe da schon was fertig, lauffähig für Linux und Windows. Ich habe damit zwar schon zwei - drei Sachen gebaut, aber noch nicht in die Tiefe getestet. Die letzten Dinge habe ich auch nur noch für Linux gemacht.

Ich werde es mal in die SourceCorner stellen. bei Zeiten (kann aber dauern, würde ich erst dann tun wollen, wenn ich einen SocketStream fertig habe).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: